因此,我读到某处对于在Java中不可变的类有3个要求。
但是我不同意#2,因为即使一个类具有mutator方法,只要这些mutator方法是私有的,它也可能是不可变的。我是对还是错?你能详细解释一下吗?
答案 0 :(得分:1)
编辑
但是我不同意#2,因为即使一个类具有mutator方法, 只要这些mutator方法是私有的,它就可能是不可变的
因为它是一个私有增变器,所以不能保证它不会改变状态,但是只要不改变状态,它就应该保持原样,所以我们可以将其视为不变的。因为一旦设置,不变性将保持不变。
不可变只有吸气剂。设置后,无法更改其字段的值。
让我们上String
类,它是不可变的
一旦创建了String
对象,就不允许对其进行更改。不能将其放大或缩小,也不能更改其中的字符之一。您可以将字符串视为完全装满且侧面不会凸出的储物盒。无法添加对象,也不能在不影响整个布置的情况下替换对象。
一个类的不变性应该是这样的。
答案 1 :(得分:0)
还有其他方法可以破坏您的不可变对象。例如,反射API。 我相信,如果您决定使其不变,那么您会介意删除私有的setter方法。只是将其保留在那里没有意义。
答案 2 :(得分:0)
直接取自维基百科:
在面向对象的函数式编程中,不可变对象(不变对象)是创建后状态无法更改的对象。
因此,绝对可以肯定的是,如果您有一个带有mutator方法的类,该方法会更改对象的状态(意为类实例),则该类不是不可变的。为了将其视为不可变的,每个方法都不得更改其状态,而必须在应用了修改的情况下产生另一个相同类的对象。
答案 3 :(得分:0)
是的,对于数据字段,没有任何变种方法。
原因是设置方法private
仅影响方法的范围。如果您想要一个真正不变的变量,那么还必须设置变量final
。这样您的变量就无法突变。
答案 4 :(得分:0)
实际上,私人变异者的意义是什么?
Immutable表示对象的状态在创建后不能以任何方式更改。不管是通过直接访问字段,通过mutator或其他更改状态的“随机”方法,都无关紧要。所有这些都不允许类是不可变的。
答案 5 :(得分:0)
关于不变性可能有不同的定义。
您提到的定义不允许对象的任何状态更改。特别是,创建后,它无法修改自己的状态。
但是,有时将不可变对象定义为不能观察改变状态的对象。当这样定义不可变性时,如果无法从外部观察到该不可变对象的状态,则可以改变该状态。例如,可以缓存昂贵的计算结果,或者可以记录一些内部统计信息,或者类似的东西。
经常提到的不可变对象的一个优点是它们是自动线程安全的。重要的是要注意,只有在以强有力的方式定义不变性时(上面的第一个选项),这种优势才成立。如果只有两个线程同时访问仅更改其不可观察状态的对象,则从原理上讲它仍然可能产生错误结果,因此程序员必须格外小心,确保该对象是线程安全的。
答案 6 :(得分:-1)
Immutable并不意味着:另一个类无法更改此Object的状态,这意味着:此Object的状态永远不能更改。
考虑以下代码:
public Person {
private String name;
public Person(String name) {
this.name = name;
}
private void setName(String name) {
this.name = name;
}
public boolean hasName(String name) {
boolean result = this.name.equals(name);
this.name = name;
return result;
}
}
这不能被认为是不可变的类,因为即使在调用hasName(String name)
的类中看起来不是这样,对象的状态也会改变。通常,不可变类通常将其成员声明为final
,因此甚至无法编译。