Java 摘要 类 良好做法
Java Abstract classes good practices
我刚刚在 Java 中学习抽象 classes,我想知道。
将包私有字段视为不良做法吗?
例如:
abstract class Parent {
String testField;
public void method() {
System.out.println(testField);
}
}
然后在 children class 我会做
public final class Children extends Parent {
@Override
public void method() {
logger.log(testField);
}
}
在这个例子中,这是不好的做法吗?
或者我应该将它们设为私有,而不是像往常一样为它们使用 getter 和 setter?
我们可以让方法在基本抽象 类 中受到保护,这样只有子 类 会覆盖它。
protected void method() {
System.out.println(testField);
}
这取决于你想做什么。然而,在许多情况下,封装或信息隐藏可能是一个有用的原则。在您的情况下,这意味着创建成员变量 protected
或 private
并仅通过 getters/setters 或根本不公开它。这产生了一些优势:
- 您可以更改 class 的实现(例如更改 testField 的类型)而不破坏其他程序员的代码
- 其他程序员的代码更清晰,因为他们只需要考虑 public 方法
- 它使代码更容易测试
- 它不鼓励特征羡慕和紧耦合
有很多建议。更喜欢组合而不是继承。首选接口而不是基础 类。保持类型层次结构平坦。 Class 应该是叶子(可以标记为 final
)或抽象。
这里最重要的做法是避免protected
。这是语言上的错误。还要避免 default/package 对顶级类型以外的任何内容进行私有访问。
一般来说(意思是在明确定义的情况下允许例外),class 的字段应该是 private
,任何访问它都需要使用 getter 或 setter(或者更一般地说,'accessor' 或 'mutator')。
一个(众所周知的)例外是 static final
不可变或原始类型的字段——有时称为 常量。
当您可以确定(真的确定)您的代码是唯一可以访问该字段的代码时(现在和所有可预见的未来),您可以考虑将其设为 public
(很少), package private
或 protected
。您会在 java
和 javax
包的 classes 中经常发现这种模式;它在那里工作是因为您不能将新的 classes 放入这些包之一,因此 class 中的代码无法访问 package private
和 protected
字段——并且因为这些包中具有 protected
字段的(抽象)基础 classes 本身不是 public
,继承无济于事。
在大多数其他情况下它不会工作(尽管自 Jigsaw 以来情况正在发生变化......),因此在这些情况下您仅限于私有内部 classes。
当然,当您只编写一次性代码时,这些注意事项就过时了。否则,您应该始终完全封装所有数据,以便 you/your 代码可以完全控制其中的任何 access/modification。
我刚刚在 Java 中学习抽象 classes,我想知道。
将包私有字段视为不良做法吗?
例如:
abstract class Parent {
String testField;
public void method() {
System.out.println(testField);
}
}
然后在 children class 我会做
public final class Children extends Parent {
@Override
public void method() {
logger.log(testField);
}
}
在这个例子中,这是不好的做法吗?
或者我应该将它们设为私有,而不是像往常一样为它们使用 getter 和 setter?
我们可以让方法在基本抽象 类 中受到保护,这样只有子 类 会覆盖它。
protected void method() {
System.out.println(testField);
}
这取决于你想做什么。然而,在许多情况下,封装或信息隐藏可能是一个有用的原则。在您的情况下,这意味着创建成员变量 protected
或 private
并仅通过 getters/setters 或根本不公开它。这产生了一些优势:
- 您可以更改 class 的实现(例如更改 testField 的类型)而不破坏其他程序员的代码
- 其他程序员的代码更清晰,因为他们只需要考虑 public 方法
- 它使代码更容易测试
- 它不鼓励特征羡慕和紧耦合
有很多建议。更喜欢组合而不是继承。首选接口而不是基础 类。保持类型层次结构平坦。 Class 应该是叶子(可以标记为 final
)或抽象。
这里最重要的做法是避免protected
。这是语言上的错误。还要避免 default/package 对顶级类型以外的任何内容进行私有访问。
一般来说(意思是在明确定义的情况下允许例外),class 的字段应该是 private
,任何访问它都需要使用 getter 或 setter(或者更一般地说,'accessor' 或 'mutator')。
一个(众所周知的)例外是 static final
不可变或原始类型的字段——有时称为 常量。
当您可以确定(真的确定)您的代码是唯一可以访问该字段的代码时(现在和所有可预见的未来),您可以考虑将其设为 public
(很少), package private
或 protected
。您会在 java
和 javax
包的 classes 中经常发现这种模式;它在那里工作是因为您不能将新的 classes 放入这些包之一,因此 class 中的代码无法访问 package private
和 protected
字段——并且因为这些包中具有 protected
字段的(抽象)基础 classes 本身不是 public
,继承无济于事。
在大多数其他情况下它不会工作(尽管自 Jigsaw 以来情况正在发生变化......),因此在这些情况下您仅限于私有内部 classes。
当然,当您只编写一次性代码时,这些注意事项就过时了。否则,您应该始终完全封装所有数据,以便 you/your 代码可以完全控制其中的任何 access/modification。