可选操作 java.lang.UnsupportedOperationException Collection

执行各种不同的添加和移除的方法在Collection接口中都是可选操作。这意味着实现类并不需要为这些方法提供方能定义。

为什么要将方法定义为可选的呢?

比如说抽象类的的某些派生类实现里,或者接口的某个实现类里面,某个方法可能是无意义的,调用该方法会抛出一个UnspportedOperationException异常。
例如Arrays.asList()会生成一个List,它基于一个固定大小的数组,所以它只需要支持那些不会改变数组大小的操作。所以对它来讲任何会引起对底层数据结构的尺寸进行修改方法都会产生一个UnspportedOperationException异常,来表示这是一个不获支持的操作。
 public class Unsupported {
  static void test(String msg, List<String> list) {
    System.out.println("--- " + msg + " ---");
    Collection<String> c = list;
    Collection<String> subList = list.subList(1,8);
    Collection<String> c2 = new ArrayList<String>(subList);
    try {
      c.retainAll(c2);
    }
    catch(Exception e) {
      System.out.println("retainAll(): " + e);
    }
    try { c.removeAll(c2); } catch(Exception e) {
      System.out.println("removeAll(): " + e);
    }
    try { c.clear(); } catch(Exception e) {
      System.out.println("clear(): " + e);
    }
    try { c.add("X"); } catch(Exception e) {
      System.out.println("add(): " + e);
    }
    try { c.addAll(c2); } catch(Exception e) {
      System.out.println("addAll(): " + e);
    }
    try { c.remove("C"); } catch(Exception e) {
      System.out.println("remove(): " + e);
    }
    // The List.set() 虽然改变了值但没有改变它的数据结构尺寸
    try {
      list.set(0, "X");
    } catch(Exception e) {
      System.out.println("List.set(): " + e);
    }
  }
  public static void main(String[] args) {
    List<String> list =
      Arrays.asList("A B C D E F G H I J K L".split(" "));
    System.out.println(list.getClass());
    test("Arrays.asList()", list);
   // System.out.println(list1.getClass());
    test("Modifiable Copy", new ArrayList<String>(list));
    //test("unmodifiableList()",Collections.unmodifiableList(new ArrayList<String>(list)));
  }
} /* Output:
class java.util.Arrays$ArrayList
--- Arrays.asList() ---
retainAll(): java.lang.UnsupportedOperationException
removeAll(): java.lang.UnsupportedOperationException
clear(): java.lang.UnsupportedOperationException
add(): java.lang.UnsupportedOperationException
addAll(): java.lang.UnsupportedOperationException
remove(): java.lang.UnsupportedOperationException
class java.util.Arrays$ArrayList里面的set()方法已重写所以不会有异常。
@Override
   public E set(int index, E element) {
       E oldValue = a[index];
       a[index] = element;
       return oldValue;
   }
对于这个Arrays.asList()来说返回的是一个基于一个固定大小数组的List,所以它不需要retainAll()、add()、remove()等改变数据结构尺寸的方法,所以没有去重写实现这些optional operation 的方法。如果去调用的话就抛出UnspportedOperationException异常。 从设计的角度说,如果一个接口的方法设计为optional,表示这个方法不是为所有的实现而设定的,而只是为某一类的实现而设定的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值