gpt4 book ai didi

java - 不可变类?

转载 作者:IT老高 更新时间:2023-10-28 11:43:32 25 4
gpt4 key购买 nike

如何使 Java 类不可变,不可变性的需求是什么,使用它有什么好处?

最佳答案

什么是不可变对象(immutable对象)?

不可变对象(immutable对象)是在实例化后不会改变状态的对象。

如何使对象不可变?

一般来说,不可变对象(immutable对象)可以通过定义一个不暴露其任何成员且不具有任何 setter 的类来创建。

以下类将创建一个不可变对象(immutable对象):

class ImmutableInt {
private final int value;

public ImmutableInt(int i) {
value = i;
}

public int getValue() {
return value;
}
}

从上面的例子可以看出,ImmutableInt的值只能在对象被实例化时设置,并且只有一个getter(getValue)实例化后无法更改对象的状态。

但是,必须注意对象引用的所有对象也必须是不可变的,否则可能会更改对象的状态。

例如,允许通过 getter 获得对数组或 ArrayList 的引用将允许通过更改数组或集合来更改内部状态:

class NotQuiteImmutableList<T> {
private final List<T> list;

public NotQuiteImmutableList(List<T> list) {
// creates a new ArrayList and keeps a reference to it.
this.list = new ArrayList(list);
}

public List<T> getList() {
return list;
}
}

上面代码的问题是,ArrayList可以通过getList获取并被操作,导致对象本身的状态被改变,因此, 不是一成不变的。

// notQuiteImmutableList contains "a", "b", "c"
List<String> notQuiteImmutableList= new NotQuiteImmutableList(Arrays.asList("a", "b", "c"));

// now the list contains "a", "b", "c", "d" -- this list is mutable.
notQuiteImmutableList.getList().add("d");

解决此问题的一种方法是在从 getter 调用时返回数组或集合的副本:

public List<T> getList() {
// return a copy of the list so the internal state cannot be altered
return new ArrayList(list);
}

不变性有什么好处?

不变性的优势在于并发性。保持可变对象的正确性很困难,因为多个线程可能会尝试更改同一对象的状态,从而导致某些线程看到同一对象的不同状态,具体取决于对所述对象的读取和写入时间对象。

通过拥有一个不可变对象(immutable对象),可以确保查看该对象的所有线程都看到相同的状态,因为不可变对象(immutable对象)的状态不会改变。

关于java - 不可变类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3162665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com