我对此感到困惑,因为b
中type B
的最终字段Object A
只能确保字段b
无法再次实例化,但状态通过在内部或外部操纵A
仍然可以改变b
的更改,那么最终如何在这里实现目的不可变性呢?
答案 0 :(得分:4)
你最后一个问题的简单答案是:它没有。
除非没有办法改变'b'的状态,否则最终将不会对'a'的可变性产生任何影响。
这些是正交概念,但是在所有可能的位置使用“final”将帮助您实现对象不变性,尽管它没有必要,你可以不用。
答案 1 :(得分:3)
final
有助于实现不可变对象。不可变对象必须确保它拥有的任何对象本身是不可变的,或者至少不是公开可变的。
在Java中没有通向不可变性的皇家道路(或者我可以补充)。
答案 2 :(得分:1)
使字段final
提供编译时检查,A不会将引用修改为B.
虽然这不足以保证A的不变性,但这是有帮助的。
防御性副本可以防止外部修改b引用的可变对象。防御副本既可以用于A构造函数接收的对象,也可以用于A访问器返回的对象。
答案 3 :(得分:0)
我不是100%肯定,但我认为差别主要在于使用final
关键字只是向程序员保证变量在执行过程中始终引用同一个对象。然而,没有什么能阻止对象本身以某种方式改变。
考虑以下伪代码:final Car c = new BMW(Color.Green, new Milage(0));
你不能在代码中将c
分配给奥迪或福特,但是“使用”宝马没有任何限制,因此在整个程序过程中它会增加。
答案 4 :(得分:0)
对象是不可变的 - 意味着一旦设置,该对象中的变量的数据或值就不能改变。
引用是不可变的 - 表示指向该对象的变量是最终变量。