类变量:公共访问只读,但私有访问可读写。

5
在我的当前项目中,我有一个类将其实例存储在变量中。此实例应该可被项目中的所有其他类访问,但只能由其自己的类更改。
如何实现这一点?

“其实例”是什么意思?这个类只有一个实例吗?(单例) - flup
是的,那就是我想表达的意思。 - th3falc0n
4个回答

20

编写一个public的getter方法,但不需要public的setter方法。同时,将字段本身设置为private


4
该字段的类型必须是不可变的。 - Matt Ball
1
如果字段的类型不是不可变的,您可以始终返回其深拷贝而不是对它本身的引用,以确保该字段不能被他人修改。 - MrSmith42

4
简单来说,这被称为“不可变对象”,在构造后对象的状态不能改变。 String是不可变Class的常见例子。
通过以下方式使一个class成为immutable
  • 确保类不能被覆盖——使classfinal,或使用static工厂并将构造函数设为私有。
  • 使字段privatefinal
  • 强制调用者在单个步骤中完全构造对象,而不是使用no-argument constructor结合后续调用setXXX方法。
  • 不要提供任何可以以任何方式更改对象状态的方法——不仅是setXXX方法,而是任何可以更改状态的方法
  • 如果类具有任何可变对象字段,则在类与其调用者之间传递时必须进行防御性复制。

2

有人建议“为私有字段提供公共getter但不提供公共setter。”

注意:这只适用于字段是原始类型的情况。
如果它是具有setter的对象,则内容仍可修改;因此不是只读的。

如果Java语言可以提供某些构造来使返回类型变成只读而不必进行深层复制/克隆,那将很有趣。

我想象中的例子:
ReadOnly getEmployee() { ...}


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接