创建对象的不可变拷贝是一向很好的防御性技巧.
Guava为所有的JDK标准集合类型和Guava新集合类型都提供了简单易用的不可变版本
不可变对象的优点
-
当对象被不可信的库掉调用时,不可变形式是安全的
-
不可变对象被多个线程调用时,不存在竞态条件问题
-
不可变集合不需要考虑变化,因此可以节省时间和空间
-
不可变对象因为有固定变,可以作为常量来安全使用
JDK提供的unmodifiableXXX方法
-
笨重而且累赘
-
不安全
-
低效
不可变集合的三种创建方式
-
copyOf方法:ImmutableSet.copyOf(set)
-
of方法:ImmutableSet.of("a","b","c")
-
Builder工具:ImmutableSet:builder().build()
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
//用JDK的方法将list变为不可变集合:该方法太笨重繁琐
List<Integer> newList = Collections.unmodifiableList(list);
//若是修改不可变集合则会:Exception in thread "main" java.lang.UnsupportedOperationException
test(newList);
}
public class UnmodifiableTest {
public static void test(List<Integer> list){
list.remove(0);
}
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
//用JDK的方法将list变为不可变集合:该方法太笨重繁琐
List<Integer> newList = Collections.unmodifiableList(list);
//若是修改不可变集合则会:Exception in thread "main" java.lang.UnsupportedOperationException
test(newList);
}
public void unmodifiableList(){
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
//创建不可变集合的第一种方式:通过已存在的集合创建
ImmutableSet<Integer> integers1 = ImmutableSet.copyOf(list);
//创建不可变集合的第二种方式:通过初始值,创建不可变集合
ImmutableSet<Integer> integers2 = ImmutableSet.of(1,2,3);
//创建不可变集合的第三种方式:通过builder创建
ImmutableSet<Object> integers3 = ImmutableSet.builder().add(1).addAll(Sets.newHashSet(1, 2, 3)).build();
}
}