Java抽象类的良好实践



我刚刚学习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?

这取决于您想要做什么。然而,在许多情况下,封装信息隐藏可能是一个有用的原则。在您的情况下,这意味着使成员变量protectedprivate,并仅通过getters/ssetters公开它,或者根本不公开。这带来了一些优势:

  • 您可以在不破坏其他程序员代码的情况下更改类的实现(例如更改testField的类型(
  • 其他程序员更清楚代码,因为他们只需要考虑公共方法
  • 它使代码更易于测试
  • 它不鼓励功能嫉妒紧密耦合

有很多建议。比起继承,更喜欢组合。比起基类,更喜欢接口。保持类型层次结构的平面化。类应该是叶子(可以标记为final(或抽象的。

这里最重要的做法是避免protected。这是语言上的错误。还要避免对除顶级类型之外的任何类型进行默认/包私有访问。

通常情况下(意味着在定义良好的情况下允许例外(,类的字段应该是private,对它的任何访问都需要使用getter或setter(或者,更常见的是,"访问器"或"赋值器"(。

一个(众所周知的(例外是不可变或基元类型的static final字段——有时称为常量

当您能够确保(真正确定(您的代码是唯一一个将访问该字段的代码(目前和未来所有可监督的字段(时,您可以考虑将其设为public(很少(、package privateprotected。您经常会在javajavax包中的类中发现这种模式;它在那里起作用,因为您无法将新类放置到其中一个包中,因此类中的代码无法访问package privateprotected字段,并且因为这些包中具有protected字段的(抽象(基类本身不是public,所以继承没有帮助。

它在大多数其他情况下都不起作用(尽管自从Jigsaw…之后情况发生了变化(,所以在这些情况下,您只能使用私有内部类。

当然,当您只编写一次性代码时,像这样的考虑就过时了。否则,你应该始终完全封装所有数据,这样你/你的代码就可以完全控制对它的任何访问/修改

我们可以使方法在基本抽象类中受到保护,以便只有子类覆盖它。

protected void method() {
System.out.println(testField);
}

最新更新