麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

未支持的操作

2019-11-18 13:22:38
字體:
來源:轉載
供稿:網友

  利用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()。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 激情宗合| 看免费av | 久久国产一级 | av观看网站 | 毛片免费网 | 亚洲自拍第一 | 毛片在线免费播放 | 爽妇网国产精品 | 国产精品自拍av | 欧美日韩亚洲视频 | 精选久久 | 久久免费视频精品 | 中国fx性欧美xxxx | hdbbwsexvideo| 精品国产亚洲人成在线 | 黄色毛片观看 | 国产成人小视频在线观看 | www国产成人免费观看视频 | 国产欧美一区二区三区免费看 | 国产亚洲在 | 国产电影精品久久 | 看免费一级毛片 | 国产一区二区三区影视 | 亚洲免费看片网站 | 毛片在线看免费 | 久色视频 | 国产在线观看av | av电影免费在线 | 国产精品视频中文字幕 | 欧美三级日本三级少妇99 | 久久久久久久久久91 | 精品国产91久久久 | 国产精品亚洲yourport | 国av在线| 91社影院在线观看 | 成人国产精品一区二区毛片在线 | 久久99久久98精品免观看软件 | 宅男噜噜噜66一区二区 | www.9191.com | 久久精品综合视频 | 色综合久久久久久久久久 |