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

Java 不可变对象与不可变对象引用之间的区别是什么?,java,Java,我对此感到困惑,因为在对象a中有一个b类型的最后字段b,只能确保字段b不能再次实例化,但a的状态仍然可以通过内部或外部操作b来更改,那么final是如何实现不可变的呢?final有助于实现不可变的对象。不可变对象必须确保其拥有的任何对象本身是不可变的,或者至少不可公开更改 Java中没有实现不变性的捷径(或者我可以补充一点)。final有助于实现不变性对象。不可变对象必须确保其拥有的任何对象本身是不可变的,或者至少不可公开更改 Java中没有实现不变性的捷径(或者,我可以补充一点)。最后一个问题

我对此感到困惑,因为在
对象a
中有一个
b类型的最后字段
b
,只能确保字段
b
不能再次实例化,但
a
的状态仍然可以通过内部或外部操作
b
来更改,那么final是如何实现不可变的呢?

final
有助于实现不可变的对象。不可变对象必须确保其拥有的任何对象本身是不可变的,或者至少不可公开更改


Java中没有实现不变性的捷径(或者我可以补充一点)。

final
有助于实现不变性对象。不可变对象必须确保其拥有的任何对象本身是不可变的,或者至少不可公开更改


Java中没有实现不变性的捷径(或者,我可以补充一点)。

最后一个问题的简单答案是:它没有

除非没有办法改变‘b’的状态,否则final将对‘a’的可变性毫无益处


这些都是正交的概念,但是在所有可能的地方使用“final”将帮助您实现对象不变性,尽管它不是必需的,您也可以不使用。

最后一个问题的简单答案是:它不是

除非没有办法改变‘b’的状态,否则final将对‘a’的可变性毫无益处


这些是正交概念,但是在所有可能的位置使用“final”将帮助您实现对象不变性,虽然它不是必需的,您也可以不使用。

我不是100%确定,但我认为本质上的区别在于,使用
final
关键字只会确保作为程序员,变量在整个执行过程中始终引用同一对象。但是,没有任何东西可以阻止对象本身以某种方式进行更改

考虑以下伪代码:
final Car c=新宝马(Color.Green,new Milage(0))


您不能在代码中将
c
分配给奥迪或福特,但“使用”没有限制你的BMW,因此它的相似性在你的程序的过程中会增加。

我不是100%确定,但我认为本质上的区别在于,使用
final
关键字只会确保作为程序员,变量在整个执行过程中始终引用相同的对象。但是,没有任何东西可以阻止对象本身以某种方式进行更改

考虑以下伪代码:
final Car c=新宝马(Color.Green,new Milage(0))


您不能将
c
分配给奥迪或福特,但“使用”您的宝马没有限制,因此在您的程序过程中,它的相似性会增加。

将字段
设置为final
提供编译时检查,以确保a没有修改对B的引用

虽然这不足以保证A的不变性,但它是有帮助的


防御副本可以防止外部修改b引用的可变对象。可以为构造函数接收的对象和访问器返回的对象创建防御副本。

使字段
为final
提供编译时检查,以确保A没有修改对B的引用

虽然这不足以保证A的不变性,但它是有帮助的


防御副本可以防止外部修改b引用的可变对象。可以为构造函数接收的对象和访问器返回的对象创建防御副本。

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


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

对象不可变-表示该对象中的变量的数据或值一旦设置就不能更改

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