在《Java编程思想》第17章容器深入研究中,描述了Collection的可选操作,即执行各种不同添加和移除的方法在Collection接口中都是可选操作。(可参考P472)
可选操作的具体实现与表现:一般是在Abstract类中实现特定方法,但是该方法体内只有一条抛出UnsupportOperationException异常语句;从而继承该抽象类却没override该方法的类,在进行向上转型使用root interface来调用该方法时,在运行时抛出异常。
定义可选操作的原因:“这样做可以防止在设计中出现接口爆炸的情况”。通过抽象类来推迟某些方法的实现,直到需要实现的时候。
深入去理解书上提出的Arrays.asList()方法,查看源码可知:
public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }
而此处的返回的ArrayList是Arrays的内部类(通过继承AbstractList实现),但是却没有重写add方法,因此使用该方法将会抛出UnsupportOperationException异常。
List<Integer> a = Arrays.asList(1,2,3); a.add(4);//Illegal
boolean b = a.contains(1);
总结:
1. 在运行时,若抛出UnsupportOperationException异常,应该从底层Abstract实现查找原因,并进行相应的重写来避免该异常;
2. 在设计模式的角度,应该面向接口编程,同时对于较多的导出Abstract类进行相应的方法可选操作;