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);
}

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

  • 您可以更改 class 的实现(例如更改 testField 的类型)而不破坏其他程序员的代码
  • 其他程序员的代码更清晰,因为他们只需要考虑 public 方法
  • 它使代码更容易测试
  • 它不鼓励特征羡慕紧耦合

有很多建议。更喜欢组合而不是继承。首选接口而不是基础 类。保持类型层次结构平坦。 Class 应该是叶子(可以标记为 final)或抽象。

这里最重要的做法是避免protected。这是语言上的错误。还要避免 default/package 对顶级类型以外的任何内容进行私有访问。

一般来说(意思是在明确定义的情况下允许例外),class 的字段应该是 private,任何访问它都需要使用 getter 或 setter(或者更一般地说,'accessor' 或 'mutator')。

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

当您可以确定(真的确定)您的代码是唯一可以访问该字段的代码时(现在和所有可预见的未来),您可以考虑将其设为 public(很少), package privateprotected。您会在 javajavax 包的 classes 中经常发现这种模式;它在那里工作是因为您不能将新的 classes 放入这些包之一,因此 class 中的代码无法访问 package privateprotected 字段——并且因为这些包中具有 protected 字段的(抽象)基础 classes 本身不是 public,继承无济于事。

在大多数其他情况下它不会工作(尽管自 Jigsaw 以来情况正在发生变化......),因此在这些情况下您仅限于私有内部 classes。

当然,当您只编写一次性代码时,这些注意事项就过时了。否则,您应该始终完全封装所有数据,以便 you/your 代码可以完全控制其中的任何 access/modification。