不可变对象与不可变对象的引用之间有什么区别?

时间:2012-07-11 12:26:30

标签: java

我对此感到困惑,因为btype B的最终字段Object A只能确保字段b无法再次实例化,但状态通过在内部或外部操纵A仍然可以改变b的更改,那么最终如何在这里实现目的不可变性呢?

5 个答案:

答案 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)

对象是不可变的 - 意味着一旦设置,该对象中的变量的数据或值就不能改变。

引用是不可变的 - 表示指向该对象的变量是最终变量。