不可变对象需要满足的条件:
对象创建以后其状态就不能修改
对象所有域都是final类型
对象是正确创建的(在对象创建期间,this引用没有溢出)
1)
final关键字:类,方法,变量
修饰类:不能被继承
修饰方法:1、锁定方法不被继承类修改 2、效率
修饰变量:基本数据类型变量、引用类型变量
package com.example.concurrency.immutable; import com.example.concurrency.annoations.NotThreadSafe; import java.util.HashMap; import java.util.Map; @NotThreadSafe public class ImmutableExample { //被final修饰的引用对象,一旦被赋值后,是不允许指向其它地址的。但是,可以修改里面的值 private final static Map<Integer,Integer> map = new HashMap<>(); static { map.put(1,5); map.put(2,9); map.put(4,3); map.put(1,8); } //sout快速输出打印 public static void main(String[] args) { System.out.println(map.toString()); map.put(4,6); System.out.println(map.toString()); } //基本数据类型的参数也是不允许修改的 private void test(final int a){ // a = 1; } //引用数据类型的指向也是不允许修改的,可以修改其中的值 private void test1(final Map<Integer,Integer> a){ a.put(1,12); // a = new HashMap<>(); } }
2)
Collections.unmodifiableXXX:Collection、List、Set、Map等
package com.example.concurrency.immutable; import com.example.concurrency.annoations.NotThreadSafe; import com.example.concurrency.annoations.ThreadSafe; import java.util.Collections; import java.util.HashMap; import java.util.Map; @ThreadSafe public class ImmutableExample1 { private static Map<Integer,Integer> map = new HashMap<>(); static { map.put(1,5); map.put(2,9); map.put(4,3); map.put(1,8); map = Collections.unmodifiableMap(map); } //sout快速输出打印 public static void main(String[] args) { System.out.println(map.toString()); map.put(4,6);//会报异常 Collections.unmodifiableMap 处理过后,不可修改 System.out.println(map.toString()); } }