背景:
使用asList方法将一个枚举类数组转为list集合,然后进行add/remove/clear方法操作集合会UnsupportedOperationException()。
问题描述
枚举类如下
public enum EquipType {
SECURE_INTERACTION_PLATFORM("xx平台"),
STORAGE("xx设备"),
FIREWALL( "xx墙"),
DNS("xx设备"),
ISOLATION_DEVICE("xx装置"),
NETWORK_EQUIPMENT("xx设备"),
PHYSICAL_MACHINE("xx机");
private String value;
EquipType() {
}
EquipType(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
/**
找到匹配的枚举
**/
public static EquipType getVal(String val){
if (StringUtils.isBlank(val)){
return null;
}
for (EquipType equipType : EquipType.values()) {
if (val.equals(equipType.getValue())){
return equipType;
}
}
return null;
}
/**
排除传入的value集合
**/
public static List<EquipType> getOtherVal(List<String> rmList){
List<EquipType> typeList = new ArrayList<>(Arrays.asList(EquipType.values()));
rmList.forEach(s -> typeList.remove(getVal(s)));
return typeList;
}
}
在项目中实际调用枚举方法去除传入的枚举值时,在这里使用了remove操作,所以造成异常
然后小写一个测试类,来看看具体情况
直接使用aslist的话,就很明显了,idea就会提示可能会造成UnsupportedOperationException异常。
我真不信,直接实战一哈。
然后果不其然的报错
解决
其实解决方法也简单,直接再给他套一层list就行。
原因分析:
我们直接点进aslist的源码康康
第一层没啥问题,再进去康康
方法返回的List对象不是常见的ArrayList,而是Arrays的一个内部类,看来其实aslist之后本质返回的是个数组,而且这个内部类没有add,clear,remove方法,抛出的异常也是来自于父类的AbstractList