作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习防御性复制......
我需要确保下面示例中的实例变量 a 是不可变的。我的类中没有修改器方法,我禁止覆盖我的访问器方法,并且 a 是私有(private)的和最终的。
但是,我不确定当我调用 getA() 时是否需要遵循第一种或第二种方法...
因为字符串是不可变的,我认为是第一,但我真的很感谢澄清,因为不可变性非常重要,我担心如果我弄错了会产生影响!
private final String a;
final String getA() {
return a;
}
或
final String getA() {
return new String(letter);
}
最佳答案
由于字符串是不可变的,因此无需创建它们的防御性副本;除了完全被另一个字符串替换之外,它们不可能被修改。因此第一个版本是正确的。事实上,由于 a
是不可变类的 final
字段,因此 a
完全不可能被任何人修改,因此它只需将其设为 public
而不使用任何访问器即可安全:public final String a
。
但请注意,完全没有必要将该方法声明为 final
:非 final
方法可能会被子类覆盖,如果该方法是调用,但重写与 a
相关的此方法并不会让子类比以前更多地访问 a
。
关于java - 字符串和不变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28977813/
我是一名优秀的程序员,十分优秀!