不可变对象
不可变对象需要满足的条件
对象创建状态后其状态就不能修改
对象所有域都是final类型
对象是正确创建的(在对象创建期间,this引用没有溢出)
final关键:修饰类、方法、变量
修饰类不能被继承
修饰方法不能被重写,一个类的private方法会隐士的指定为final方法
修饰变量不能被更改,基本数据类型变量,引用类型变量
实例代码:
public class ImmutableExample1 {
public static final Integer a=1;
public static final Integer b=2;
public static final Map<String,Object> maps= Maps.newHashMap();
static{
maps.put("a","a");
maps.put("b","b");
maps.put("c","c");
}
public static void main(String[] args) {
// a=3;
// b=4;
// maps=Maps.newHashMap();
maps.put("c","d");
}
private void test(final int a){
//a=2;
}
}
注:基本数据类型是不允许修改的,对于引用类型它不允许做的是一旦赋值了以后就不允许指向新的对象,但是却允许修改里面的值,这个时候会引发线程安全问题
其它不可变对象创建方法
Collections.unmodifiableXXXX:Collections、List、Set、Map都有对应的不可变方法
Guava:ImmutableXXX:Collections、List、Set、Map
实例代码
public static final Integer a=1;
public static final Integer b=2;
public static Map<String,Object> maps= Maps.newHashMap();
static{
maps.put("a","a");
maps.put("b","b");
maps.put("c","c");
maps= Collections.unmodifiableMap(maps);
}
public static void main(String[] args) {
// a=3;
// b=4;
// maps=Maps.newHashMap();
maps.put("c","d");
System.out.println("maps:"+maps.get("c"));
}
注:使用unmodifiableMap可以put值但是在启动的时候会抛出异常 java.lang.UnsupportedOperationException
private static final ImmutableList<Integer> list=ImmutableList.of(1,2,3);
private static final ImmutableSet<Integer> set=ImmutableSet.copyOf(list);
public static void main(String[] args) {
list.add(4);
}
注:ImmutableList启动会抛出异常java.lang.UnsupportedOperationException
private static final ImmutableMap<Integer,Integer> maps=ImmutableMap.<Integer,Integer>of(1,1,2,2);
private static final ImmutableMap<Integer,Integer> maps1=ImmutableMap.<Integer,Integer>builder().put(1,1)
.put(2,2).build();
注:ImmutableMap两种赋值的方法