受保护的方法vs受保护的属性

时间:2019-12-06 10:15:48

标签: java inheritance visibility

子类必须能够使用种子随机数生成器。

使用的优缺点

public abstract class AbstractClass {
  protected Random rnd;

  public AbstractClass(long seed) {
    rnd = new Random(seed);
  }
}

public abstract class AbstractClass {
  private Random rnd;

  public AbstractClass(long seed) {
    rnd = new Random(seed);
  }

  protected Random getRnd() {
    return rnd;
  }

  protected Random setRnd(Random rnd) {
    this.rnd = rnd;
  }
}

1 个答案:

答案 0 :(得分:0)

protected成员是 public API的一部分。也就是说,它们对于后来出现(可能是几年后)并编写子类的开发人员是完全可见的。他们甚至可以覆盖方法并将其设置为public(可见性扩大有效,可见性缩小则无效)。

因此,应该像避免protected字段一样避免使用public字段:它们禁止将来的扩展更改类不变性或行为。

例如,如果您需要返回惰性实例化或线程本地对象该怎么办?对于protected字段,这是不可能的。尽管 [需要引用] ,但是受保护的字段是否是最佳解决方案仍有待商bat。

(有效的Java,第13和17项)

相关问题