12.5 Card对象是不可修改的

Card 的实例变量都是私有的,因此在其他类中无法访问。我们可提供获取方法,让其他类能够读取实例变量 ranksuit 的值:

  1. public int getRank() {
  2. return this.rank;
  3. }
  4. public int getSuit() {
  5. return this.suit;
  6. }

是否提供设置方法属于设计方面的决策。如果我们提供了,Card 对象将是可修改的,因此可以将一张牌变成另一张牌。这可能不是我们所需要的功能,而且一般而言,可修改的对象更容易出错。因此,让 Card 对象不可修改可能是更好的选择。为此,只要不提供任何非纯方法(包括设置方法)就可以了。

这很容易,但并不牢靠,因为以后可能有人傻乎乎地添加非纯方法。为防范这种情况,可将实例变量声明为 final 的:

  1. public class Card {
  2. private final int rank;
  3. private final int suit;
  4. ...
  5. }

你依然可以在构造函数中给这些变量赋值,但如果有人编写试图修改这些变量的方法,编译器将报错。