字符串和不变性

时间:2015-03-11 02:56:43

标签: java

我正在学习防御性复制.....

我需要确保下面示例中的实例变量a是不可变的。我没有在课堂上使用mutator方法,我禁止我的访问器方法被覆盖,而且a是私有的和最终的。

但是,我不确定当我调用getA()时,我是否需要遵循第一种或第二种方法......

因为字符串是不可变的,我认为第一个,但我真的很感激澄清,因为不变性是如此重要,如果我弄错了,我会担心其含义!

 private final String a;


   final String getA() {

      return a;

    }

   final String getA() {

      return new String(letter);

    }

2 个答案:

答案 0 :(得分:3)

由于字符串是不可变的,因此无需创建它们的防御副本;除了完全被另一个字符串替换之外,它们不可能被修改。因此第一个版本是正确的。实际上,由于a是不可变类的final字段,因此a完全不可能被任何人修改,因此简单地使public进行修改public final String a 1}}根本没有访问者:final

但请注意,完全没有必要将方法声明为final:非 - a方法可能会被子类覆盖,如果调用该方法会改变行为,但会覆盖此方法与a相关的内容不再为子类提供{{1}}的访问权限。

答案 1 :(得分:3)

你说得对。顺便说一下,方法上的final修饰符只表示该方法不能在任何子类中重写,它与a的不变性无关。