二、不可变对象-Collections.unmodifiableXX map、list、set
代码示例(可以自行运行测试):
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/**
* 不可变对象-Collections.unmodifiableXX map、list、set
* @author stx
* @date 2018/5/16 14:14
* @desc
*/
@Slf4j
public class ImmutableExample1 {
private static Map map = Maps.newHashMap();
private static List list = Lists.newArrayList();
static {
map.put(1,"a");
map.put(2,"b");
map.put(3,"c");
map = Collections.unmodifiableMap(map);
list.add(1);
list.add(2);
list.add(3);
list = Collections.unmodifiableList(list);
}
public static void main(String[] args) {
log.info(String.valueOf(list.get(2)));
map.put(2, "bb");
log.info(map.get(2));
}
}
先贴下运行结果(list 执行成功,map 执行抛异常:UnsupportedOperationException)
16:19:51.162 [main] INFO com.yan.spring.springboot.example.ImmutableExample1 - 3
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableMap.put(Collections.java:1457)
at com.yan.spring.springboot.example.ImmutableExample1.main(ImmutableExample1.java:38)
针对map的异常我们一起分析下,map对象执行这行代码之后
map = Collections.unmodifiableMap(map); 我们跟进unmodifiableMap的源码,发现这里new了一个新的UnmodifiableMap对象
public static Map unmodifiableMap(Map extends K, ? extends V> m) {
return new UnmodifiableMap<>(m);
}
而创建对象的类中除了读取方法基本都替换成如下实现:
throw new UnsupportedOperationException();
所以运行结果时map抛出了不支持操作的异常;那么我们平时使用不可变容器的时候就可以使用以上方式了。
这里没有提供set的示例,set使用:Collections.unmodifiableSet