Java不可变类
2018-08-20 本文已影响13人
SHAN某人
1. 什么是不可变类?
可变类 | 不可变类 | |
---|---|---|
可变类的实例创建后可以改变其成员变量的值。 | 类的实例一旦创建后,不能改变其成员变量的值。 |
2. 如何创建不可变类?
2.1通过 Collections.unmodifiable*** 创建不可变类
private static Map map = new HashMap<>();
static {
map.put("shan",1);
map.put("li",1);
map.put("zhang",1);
map = Collections.unmodifiableMap(map);
}
2.2 通过 第三方包guava的 Immutable**** 创建不可变类
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
// 线程安全
public class ImmutableExample3 {
private final static ImmutableList<Integer> list = ImmutableList.of(1, 2, 3);
private final static ImmutableSet set = ImmutableSet.copyOf(list);
private final static ImmutableMap<Integer, Integer> map = ImmutableMap.of(1, 2, 3, 4);
private final static ImmutableMap<Integer, Integer> map2 = ImmutableMap.<Integer, Integer>builder()
.put(1, 2).put(3, 4).put(5, 6).build();
public static void main(String[] args) {
System.out.println(map2.get(3));
}
}
3. 如何设计不可变类?
- 将类声明为final,所以它不能被继承
- 将所有的成员声明为private final,这样就不可直接访问和修改
- 任何获取/修改属性的方法都不应作用于属性本身。
- 对变量不要提供setter方法
- 将所有可变的成员声明为final,这样只能对它们赋值一次
- 通过构造器初始化所有成员,进行深拷贝(deep copy)
- 在getter方法中,不要直接返回对象本身,而是克隆对象,并返回对象的拷贝
待补充,待完善,待深入