我刚刚学习Java中的抽象类,我很想知道
拥有包私有字段会被视为不良做法吗
例如:
abstract class Parent {
String testField;
public void method() {
System.out.println(testField);
}
}
然后在儿童课上,我会做
public final class Children extends Parent {
@Override
public void method() {
logger.log(testField);
}
}
在这个例子中,这会是不好的做法吗
或者我应该把它们设为私有,像往常一样为它们使用getter和setter?
这取决于您想要做什么。然而,在许多情况下,封装或信息隐藏可能是一个有用的原则。在您的情况下,这意味着使成员变量protected
或private
,并仅通过getters/ssetters公开它,或者根本不公开。这带来了一些优势:
- 您可以在不破坏其他程序员代码的情况下更改类的实现(例如更改testField的类型(
- 其他程序员更清楚代码,因为他们只需要考虑公共方法
- 它使代码更易于测试
- 它不鼓励功能嫉妒和紧密耦合
有很多建议。比起继承,更喜欢组合。比起基类,更喜欢接口。保持类型层次结构的平面化。类应该是叶子(可以标记为final
(或抽象的。
这里最重要的做法是避免protected
。这是语言上的错误。还要避免对除顶级类型之外的任何类型进行默认/包私有访问。
通常情况下(意味着在定义良好的情况下允许例外(,类的字段应该是private
,对它的任何访问都需要使用getter或setter(或者,更常见的是,"访问器"或"赋值器"(。
一个(众所周知的(例外是不可变或基元类型的static final
字段——有时称为常量。
当您能够确保(真正确定(您的代码是唯一一个将访问该字段的代码(目前和未来所有可监督的字段(时,您可以考虑将其设为public
(很少(、package private
或protected
。您经常会在java
和javax
包中的类中发现这种模式;它在那里起作用,因为您无法将新类放置到其中一个包中,因此类中的代码无法访问package private
和protected
字段,并且因为这些包中具有protected
字段的(抽象(基类本身不是public
,所以继承没有帮助。
它在大多数其他情况下都不起作用(尽管自从Jigsaw…之后情况发生了变化(,所以在这些情况下,您只能使用私有内部类。
当然,当您只编写一次性代码时,像这样的考虑就过时了。否则,你应该始终完全封装所有数据,这样你/你的代码就可以完全控制对它的任何访问/修改
我们可以使方法在基本抽象类中受到保护,以便只有子类覆盖它。
protected void method() {
System.out.println(testField);
}