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引用的可变对象。可以为构造函数接收的对象和访问器返回的对象创建防御副本。对象不可变-意味着一旦设置,该对象中的变量数据或值就不能更改
引用不可变-表示指向该对象的变量是最终变量。对象不可变-表示该对象中的变量的数据或值一旦设置就不能更改
引用不可变-表示指向该对象的变量是最终变量