Java 受保护的方法与受保护的属性

Java 受保护的方法与受保护的属性,java,inheritance,visibility,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(l

子类需要能够使用种子随机数生成器

使用的优点和缺点是什么

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

受保护的
成员是公共API的一部分。也就是说,开发人员在稍后的时间点(可能是几年后)编写子类时完全可以看到它们。它们甚至可以覆盖这些方法,并将它们公开(可见性加宽是有效的,可见性缩小是无效的)

因此,
受保护的
字段应避免使用与避免
公共
字段相同的方法:它们禁止将来更改类不变量或行为的扩展

例如,如果需要返回延迟实例化或线程本地对象,该怎么办?对于受保护的
字段,这一切都不可能实现。尽管[需要引证],但受保护字段是否是最佳解决方案仍有争议


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

无论如何,您应该将
rnd
设置为final
。在第一种情况下,您也可以通过将字段设置为final来实现这一点。@luk2302很好,谢谢您指出这一点。我编辑了我的问题(糟糕的做法,对不起),提出了我实际上更感兴趣的问题。使用无操作方法(getter-protected)是使代码无法维护的众多方法之一,因此
protected
成员比
protected
属性更好……字段和方法都是成员。”属性是存储在对象中的东西,并且始终是字段,但可以是可访问字段,也可以是使用getter/setter方法的私有字段。无论如何,公共/受保护的方法比字段更好,这就是我要说的。