小编cod*_*tes的帖子

如何在 Java 中安全地使用不可变类中的集合?

我尝试实现不可变类,并且看到一条规则说明“在 getter 方法中执行对象克隆以返回副本而不是返回实际对象引用”。

我知道当我们使用不可变对象时,从 getter 返回的复制/克隆集合不会发生变化。当我们使用自定义类时,从 getter 返回的克隆(浅复制)集合也可以看到原始集合的变化。

在下面的代码中,我无法理解这种情况:

我创建了两种方法,一种用于将原始集合作为 courseList 返回,另一种用于课程列表的浅拷贝。

我为本地引用 clist1 和 clist2 分配了两个版本。

然后我更改了原始列表中的项目。当我通过学生对象到达它们时,我也可以看到更改的原始列表和复制的列表。但是,通过我之前指向克隆课程列表的参考,无法看到更改!我认为它也应该受到变化的影响。为什么我看不到以前复制的版本的变化? 这是参考,我认为它应该指向相同的内存区域,我还通过下面的另一个示例再次检查结果。我创建了一个包含 StringBuilder 的列表。我将新的 strs 应用到 stringbuilder 中,然后我可以看到更改后的先前复制的列表版本。

那么,主要问题是,我必须始终在不可变类中使用深拷贝吗?这是错误的用法吗?在不可变类中使用集合的安全方法是什么?

提前致谢。

不可变学生.java


public final class ImmutableStudent {

    public ImmutableStudent(String _name, Long _id, String _uni, ArrayList<String> _courseList){
        name = _name;
        id = _id;
        uni = _uni;
        courseList = new ArrayList<>();
        _courseList.forEach( course -> courseList.add(course));
    }

    private final String name;
    private final Long id;
    private final String uni;
    private final ArrayList<String> courseList;


    public String getName() …
Run Code Online (Sandbox Code Playgroud)

java collections immutability deep-copy shallow-copy

2
推荐指数
1
解决办法
126
查看次数