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

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

然后我想到了: Card 类的对象应该是不可变的。所以我重新阅读了 Effective Java 2nd Edition 以了解该怎么做,然后我发现不可变类需要是 final 的,以避免子类破坏不可变性。

我还查看了互联网,每个人似乎都同意这一点。

那么 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();
  }
}

谢谢。

最佳答案

子类实际上不能修改其父类中 private final 属性的值,但它可以表现得好像它有,这就是 Effective Java warns against :

关于java - 每个不可变的类都应该是最终的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5607277/

10-11 21:10