我正在学习防御性复制.....
我需要确保下面示例中的实例变量a是不可变的。我没有在课堂上使用mutator方法,我禁止我的访问器方法被覆盖,而且a是私有的和最终的。
但是,我不确定当我调用getA()时,我是否需要遵循第一种或第二种方法......
因为字符串是不可变的,我认为第一个,但我真的很感激澄清,因为不变性是如此重要,如果我弄错了,我会担心其含义!
private final String a;
final String getA() {
return a;
}
或
final String getA() {
return new String(letter);
}
答案 0 :(得分:3)
由于字符串是不可变的,因此无需创建它们的防御副本;除了完全被另一个字符串替换之外,它们不可能被修改。因此第一个版本是正确的。实际上,由于a
是不可变类的final
字段,因此a
完全不可能被任何人修改,因此简单地使public
进行修改public final String a
1}}根本没有访问者:final
。
但请注意,完全没有必要将方法声明为final
:非 - a
方法可能会被子类覆盖,如果调用该方法会改变行为,但会覆盖此方法与a
相关的内容不再为子类提供{{1}}的访问权限。
答案 1 :(得分:3)
你说得对。顺便说一下,方法上的final
修饰符只表示该方法不能在任何子类中重写,它与a
的不变性无关。