7 什么是 Java 中的不可变类?

约 381 个字 预计阅读时间 1 分钟

不可变类指的是无法修改对象的值,比如 String 就是典型的不可变类,当你创建一个 String 对象之后,这个对象就无法被修改。

因为无法被修改,所以像执行s += "a"; 这样的方法,其实返回的是一个新建的 String 对象,老的 s 指向的对象不会发生变化,只是 s 的引用指向了新的对象而已。

所以不要在字符串拼接频繁的场景使用 + 来拼接,因为这样会频繁的创建对象。

不可变类的好处就是安全,因为知晓这个对象不可能会被修改,因此可以放心大胆的用,在多线程环境下也是线程安全的。

如何实现一个不可变类?

这个问题我被面试官问过,其实就参考 String 的设计就行。

String 类用 final 修饰,表示无法被继承。

String 本质是一个 char 数组,然后用 final 修饰,不过 final 限制不了数组内部的数据,所以这还不够。

所以 value 是用 private 修饰的,并且没有暴露出 set 方法,这样外部其实就接触不到 value 所以无法修改。

当然还是有修改的需求,比如 replace 方法,所以这时候就需要返回一个新对象来作为结果。

总结一下就是私有化变量,然后不要暴露 set 方法,即使有修改的需求也是返回一个新对象。