будет препятствовать тому, чтобы дочерний класс переопределил их.

рабатывал карточный класс для игры в блэкджек.

Мой замысел состоял в том, чтобы создать класс Card с помощью getValue (), который возвращает, например, 11 для J, 12 для Q и 13 для K, а затем расширить его с помощью класса 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();
  }
}

Благодарю.