gpt4 book ai didi

java - java中的不可变类

转载 作者:行者123 更新时间:2023-11-29 10:01:20 28 4
gpt4 key购买 nike

是否需要将 Immutable 类的字段设置为 private,就像它们被标记为 final 一样,不能更改?
我的意思是仅仅将字段标记为 final 还不够吗?

(我知道不可变类没有必要有 final 字段,但建议在编译时在内部检查类。)

最佳答案

不,这还不够。

考虑这个例子:

final class ImmutableClass {
private final List<String> data;

public ImmutableClass(final List<String> data) {
this.data = data;
}

public List<String> getData() {
return data;
}
}

这个类是final所以不能延长。这是data字段是 final因此在分配后无法更改。

但是:

final ImmutableClass immutableClass = new ImmutableClass(data);
immutableClass.getData().add("Some other value");

糟糕。

因此,要使一个类真正不可变,所有字段也应该是不可变类,或者具有防御性副本

例如,要更正您需要执行的问题:

final class ImmutableClass {
private final List<String> data;

public ImmutableClass(final List<String> data) {
this.data = new ArrayList<>(data);
}

public List<String> getData() {
return Collections.unmodifiableList(data);
}
}

这只适用于 String是不可变的。例如,如果你有一个 List<Date>您还需要复制个人 Date对象。

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

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