关于对象是否具备不可变性的疑惑

来源:8-4 栈封闭技术

慕沐3053333

2020-03-17

public class ImmutableDemo {

    private Set<String> students = new HashSet<>();

    public ImmutableDemo() {
        students.add("李小美");
        students.add("王壮");
        students.add("徐福记");
    }

    public boolean isStudent(String name) {
        return students.contains(name);
    }
}

上述类的对象中,student属性是private修饰,并且也没有向外暴露修改其状态的方法,这个对象是否具备不可变性?但是它的student属性又没有final修饰,不符合您对对象不可变的第二个条件定义:
图片描述
所以您总结出的对象不可变的条件是否有不妥?
个人认为:第一个条件是对象具有不可变性的表现特征,而不是条件。
第二个条件是希望对象具有不可变性的一种举措,当然这种举措不一定使得对象具有不可变性,还需要引用类型属性指向的对象具备不可变性。而且这种举措可有可无(如所有属性是private且不向外提供修改其属性的方法)。
简而言之,“对象创建后,其状态就不能修改”是“对象具备不可变性”的充分必要条件。
“所有属性都是final修饰” 不是“ 对象具备不可变性” 的必要条件,

写回答

2回答

悟空

2020-03-17

正如上面所说,所有域都是final类型的这个条件,并不是一个必要条件,但是是大多数情况下的必要条件,如果我们的情况特殊,那么可以不是final的,依然保持不可变。

0
0

悟空

2020-03-17

小伙伴的问题很好,下面我给出Java并发编程实战对于不可变的介绍:

//img.mukewang.com/szimg/5e70cfed09b52c3321242234.jpg

//img.mukewang.com/szimg/5e70cf8e094bfc3320921408.jpg

0
0

深度解密Java并发工具,精通JUC,成为并发多面手

JUC全方位讲解,构建并发工具类知识体系

1599 学习 · 573 问题

查看课程