【问题标题】:protected method vs protected property受保护的方法与受保护的属性
【发布时间】:2020-03-31 07:49:52
【问题描述】:

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

使用的优缺点是什么

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

【问题讨论】:

  • 无论如何你都应该创建rnd final
  • 在第一种情况下,您也可以通过将您的字段设为 final 来实现。
  • @luk2302 好点,感谢您指出这一点。我编辑了我的问题(不好的做法,抱歉)来问我实际上更感兴趣的问题。
  • 制作无操作方法 - getter - protected 是使您的代码无法维护的众多方法之一

标签: java inheritance visibility


【解决方案1】:

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

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

例如,如果您需要延迟实例化或返回线程本地对象怎么办?使用protected 字段,这一切都是不可能的。尽管[需要引用],受保护的字段是否是最好的解决方案是值得商榷的。

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

【讨论】:

  • 所以protected 成员比protected 属性...
  • 字段和方法都是成员。 “属性”是存储在对象中的东西,并且始终是字段,但可以是可访问字段或具有 getter/setter 方法的私有字段。无论如何,我所说的公共/受保护方法比 Fields 更好。
猜你喜欢
  • 2016-02-19
  • 2011-03-11
  • 2012-10-13
  • 2011-06-06
  • 1970-01-01
  • 2012-09-05
  • 2023-03-03
  • 1970-01-01
  • 2011-10-26
相关资源
最近更新 更多