java中的不可变类

时间:2012-10-20 03:40:55

标签: java reflection immutability

通过遵循所有java标准

,我使我的类不可变
A. Defined class as final
B. declared all fields as private and final
C. No setter method
D. No method changes the state of object
E. declared all method as final
F. Safer/defencieve copying of collection/ non mutable object fields.

这些是我在设计不可变类时所做的初步检查点。

但是还有一个问题,我的对象仍然可以通过java反射进行修改,对不对? 或者我在班上错过了什么点?

提前致谢。

3 个答案:

答案 0 :(得分:7)

没有隐藏在反思中 - 即使是不可变的类也无法免疫。但是,你无能为力,所以“不能通过反思修改”不是不变性的标准之一。

答案 1 :(得分:2)

是。反射仍然可以访问/更改它。你无法真正反对这一点。如果有人用反射改变你的对象,我会怀疑他们正在写的代码的质量。

不可变类非常适合确保线程安全的应用程序。不可变对象始终是线程安全的。如果您正在寻找更多有用的信息,请阅读Effective Java。对任何Java开发人员来说都是必读的。

答案 2 :(得分:1)

是的,仍然可以通过反思进行修改。除此之外,你似乎已经采取了必要的谨慎措施,使其不可变。