未支持的操纵
当前位置:以往代写 > JAVA 教程 >未支持的操纵
2019-06-14

未支持的操纵

未支持的操纵

操作static(静态)数组Arrays.toList(),也许能将一个数组转换成List,如下所示:
 

//: Unsupported.java
// Sometimes methods defined in the Collection
// interfaces don't work!
package c08.newcollections;
import java.util.*;

public class Unsupported {
  private static String[] s = {
    "one", "two", "three", "four", "five",
    "six", "seven", "eight", "nine", "ten",
  };
  static List a = Arrays.toList(s);
  static List a2 = Arrays.toList(
    new String[] { s[3], s[4], s[5] });
  public static void main(String[] args) {
    Collection1.print(a); // Iteration
    System.out.println(
      "a.contains(" + s[0] + ") = " + 
      a.contains(s[0]));
    System.out.println(
      "a.containsAll(a2) = " + 
      a.containsAll(a2));
    System.out.println("a.isEmpty() = " +
      a.isEmpty());
    System.out.println(
      "a.indexOf(" + s[5] + ") = " + 
      a.indexOf(s[5]));
    // Traverse backwards:
    ListIterator lit = a.listIterator(a.size());
    while(lit.hasPrevious())
      System.out.print(lit.previous());
    System.out.println();
    // Set the elements to different values:
    for(int i = 0; i < a.size(); i++)
      a.set(i, "47");
    Collection1.print(a);
    // Compiles, but won't run:
    lit.add("X"); // Unsupported operation
    a.clear(); // Unsupported
    a.add("eleven"); // Unsupported
    a.addAll(a2); // Unsupported
    a.retainAll(a2); // Unsupported
    a.remove(s[0]); // Unsupported
    a.removeAll(a2); // Unsupported
  }
} ///:~

从中可以看出,实际只实现了Collection和List接口的一部门。剩余的要教育致了不受接待的一种环境,名为UnsupportedOperationException。在下一章里,我们会报告违例的具体环境,但在这里有须要举办一下简朴说明。这里的要害在于“荟萃接口”,以及新荟萃库内的另一些接口,它们都包括了“可选的”要领。在实现那些接口的荟萃类中,可能提供、可能没有提供对那些要领的支持。若挪用一个未获支持的要领,就会导致一个UnsupportedOperationException(操纵未支持违例),这表白呈现了一个编程错误。
各人或者会以为奇怪,不是说“接口”和基本类最大的“卖点”就是它们许诺这些要领能发生一些有意义的行为吗?上述违例粉碎了谁人许诺——它挪用的一部门要领不只不能发生有意义的行为,并且还会中止措施的运行。在这些环境下,范例的所谓安详担保好像显得一钱不值!可是,环境并没有想象的那么坏。通过Collection,List,Set可能Map,编译器仍然限制我们只能挪用谁人接口中的要领,所以它和Smalltalk照旧存在一些区此外(在Smalltalk中,可为任何工具挪用任何要领,并且只有在运行措施时才知道这些挪用是否可行)。除此以外,以Collection作为自变量的大大都要领只能从谁人荟萃中读取数据——Collection的所有“read”要领都不是可选的。
这样一来,系统就可制止在设计期间呈现接口的斗嘴。而在荟萃库的其他设计方案中,最终常常城市获得数量过多的接口,用它们描写根基方案的每一种变革形式,所以进修和把握显得很是坚苦。有些时候,甚至难于捕获接口中的所有非凡环境,因为人们大概设计出任何新接口。但Java的“不支持的操纵”要领却到达了新荟萃库的一个重要设计方针:易于进修和利用。可是,为了使这一要领真正有效,却需满意下述条件:
(1) UnsupportedOperationException必需属于一种“很是”事件。也就是说,对付大大都类来说,所有操纵都应是可行的。只有在一些非凡环境下,一、两个操纵才大概未获支持。新荟萃库满意了这一条件,因为绝大大都时候用到的类——ArrayList,LinkedList,HashList和HashMap,以及其他荟萃方案——都提供了对所有操纵的支持。可是,假如想新建一个荟萃,同时不想为荟萃接口中的所有要领都提供有意义的界说,同时令其仍与现有库共同,这种设计要领也确实提供了一个“后门”可以操作。
(2) 若一个操纵未获支持,那么UnsupportedOperationException(未支持的操纵违例)极有大概在实现期间呈现,则不是在产物已交付给客户今后才会呈现。它究竟指出的是一个编程错误——不正确地利用了一个类。这一点不能十分确定,通过也可以看出这种方案的“试验”特征——只有颠末多次试验,才气找出最抱负的事情方法。

在上面的例子中,Arrays.toList()发生了一个List(列表),该列表是由一个牢靠长度的数组后推出来的。因此独一可以或许支持的就是那些不改变数组长度的操纵。在另一方面,若请求一个新接口表达差异种类的行为(大概叫作“FixedSizeList”——牢靠长度列表),就有遭遇更大的庞洪水平的危险。这样一来,今后试图利用库的时候,很快就会发明本身不知从那里下手。
对那些回收Collection,List,Set可能Map作为参数的要领,它们的文档该当指出哪些可选的要领是必需实现的。举个例子来说,排序要求实现set()和Iterator.set()要领,但不包罗add()和remove()。

    关键字:

在线提交作业