oop如果Java中的一个类有一个私有的mutator方法,它能是不可变的吗?
所以,我在某个地方读到,在Java中,类是不可变的有3个要求
- 所有数据字段都必须是私有的李>
- 数据字段不能有任何mutator方法李>
- 没有访问器方法可以返回对可变数据字段的引用李>
但我不同意#2,因为即使一个类有mutator方法,只要这些mutator方法是私有的,它也可以是不可变的。我是对还是错?你能详细解释一下吗
你可以在下面搜索框中键入要查询的问题!
所以,我在某个地方读到,在Java中,类是不可变的有3个要求
但我不同意#2,因为即使一个类有mutator方法,只要这些mutator方法是私有的,它也可以是不可变的。我是对还是错?你能详细解释一下吗
# 1 楼答案
直接摘自维基百科:
所以,如果有一个类使用了一个mutator方法来改变对象的状态(作为类实例),那么这个类肯定不是不变的。若要将其视为不可变的,则每一个方法都不能更改其状态,而是用修改后生成另一个同一类的对象。
# 2 楼答案
不变性有不同的可能定义
您提到的定义不允许对象的任何状态更改。特别是,在创建之后,它不能修改自己的状态
然而,有时,一个不可变的对象被定义为一个状态不能被观察到改变的对象。当这样定义不变性时,如果无法从外部观察到不可变对象的状态变化,则允许该状态变化。例如,可以缓存昂贵计算的结果,或者记录一些内部统计信息,或者诸如此类的东西
经常提到的不可变对象的一个优点是它们是自动线程安全的。需要注意的是,只有当您以强的方式定义不变性时(上面的第一个选项),这种优势才有效。如果一个只改变其不可观察状态的对象被两个线程同时访问,原则上它仍可能产生错误的结果,因此程序员必须额外注意该对象是线程安全的
# 3 楼答案
编辑
因为它是一个私有的变异子,并不保证它不会改变状态,但只要它不改变状态,它应该保持不变的东西,我们就可以认为是不变的。因为一旦设定,不变性将保持不变
Immutable只有一个getter。一旦设置,就无法更改其字段的值
让我们以
String
类为例,它是不可变的一旦创建了
String
对象,就不允许对其进行更改。它不能变大或变小,也不能更改其中的一个字符。你可以把一根绳子想象成一个装满东西的储物箱,它的侧面不会凸起。无法添加对象,也无法在不影响整个排列的情况下替换对象所以类的不变性应该是这样的