每个不可变的班级应该是最终的吗?

gai*_*nco 4 java final immutability

我正在设计一个用于二十一点游戏的Card类.

我的设计是使用getValue()创建一个Card类,例如返回J为11,Q为12,K为13,然后使用BlackjackCard类扩展它以覆盖该方法,以便这些卡返回10.

然后有些东西击中了我:Card类的对象应该是不可变的.所以我重新阅读了Effective Java 2nd Edition,看看该做什么,我发现不可变类需要是最终的,以避免子类打破不变性.

我也看过互联网,每个人似乎都同意这一点.

Card类应该是最终的吗?

你如何打破这个类的不变性,扩展它:

class Card {
  private final Rank rank;
  private final Suit suit;
  public Card(Rank rank, Suit suit) {
    this.rank = rank;
    this.suit = suit;
  }
  public Rank getRank() {
    return rank;
  }
  public Suit getSuit() {
    return suit;
  }
  public int getValue() {
    return rank.getValue();
  }
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Way*_*ett 5

子类实际上不能修改private final其父级中属性的值,但它的行为可能就像它具有的一样,这就是Effective Java警告的:

确保无法扩展该类. 这可以防止粗心或恶意子类通过表现为对象的状态已更改来破坏类的不可变行为.