国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

未支持的操作

2019-11-18 13:22:38
字體:
供稿:網(wǎng)友

  利用static(靜態(tài))數(shù)組Arrays.toList(),也許能將一個(gè)數(shù)組轉(zhuǎn)換成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
   }
  } ///:~
  
  從中可以看出,實(shí)際只實(shí)現(xiàn)了Collection和List接口的一部分。剩余的方法導(dǎo)致了不受歡迎的一種情況,名為UnsupportedOperationException。在下一章里,我們會(huì)講述違例的具體情況,但在這里有必要進(jìn)行一下簡(jiǎn)單說明。這里的要害在于“集合接口”,以及新集合庫內(nèi)的另一些接口,它們都包含了“可選的”方法。在實(shí)現(xiàn)那些接口的集合類中,或者提供、或者沒有提供對(duì)那些方法的支持。若調(diào)用一個(gè)未獲支持的方法,就會(huì)導(dǎo)致一個(gè)UnsupportedOperationException(操作未支持違例),這表明出現(xiàn)了一個(gè)編程錯(cuò)誤。
  大家或許會(huì)覺得希奇,不是說“接口”和基礎(chǔ)類最大的“賣點(diǎn)”就是它們?cè)S諾這些方法能產(chǎn)生一些有意義的行為嗎?上述違例破壞了那個(gè)許諾——它調(diào)用的一部分方法不僅不能產(chǎn)生有意義的行為,而且還會(huì)中止程序的運(yùn)行。在這些情況下,類型的所謂安全保證似乎顯得一錢不值!但是,情況并沒有想象的那么壞。通過Collection,List,Set或者M(jìn)ap,編譯器仍然限制我們只能調(diào)用那個(gè)接口中的方法,所以它和Smalltalk還是存在一些區(qū)別的(在Smalltalk中,可為任何對(duì)象調(diào)用任何方法,而且只有在運(yùn)行程序時(shí)才知道這些調(diào)用是否可行)。除此以外,以Collection作為自變量的大多數(shù)方法只能從那個(gè)集合中讀取數(shù)據(jù)——Collection的所有“read”方法都不是可選的。
  這樣一來,系統(tǒng)就可避免在設(shè)計(jì)期間出現(xiàn)接口的沖突。而在集合庫的其他設(shè)計(jì)方案中,最終經(jīng)常都會(huì)得到數(shù)量過多的接口,用它們描述基本方案的每一種變化形式,所以學(xué)習(xí)和把握顯得非常困難。有些時(shí)候,甚至難于捕捉接口中的所有非凡情況,因?yàn)槿藗兛赡茉O(shè)計(jì)出任何新接口。但Java的“不支持的操作”方法卻達(dá)到了新集合庫的一個(gè)重要設(shè)計(jì)目標(biāo):易于學(xué)習(xí)和使用。但是,為了使這一方法真正有效,卻需滿足下述條件:
  (1) UnsupportedOperationException必須屬于一種“非?!笔录R簿褪钦f,對(duì)于大多數(shù)類來說,所有操作都應(yīng)是可行的。只有在一些非凡情況下,一、兩個(gè)操作才可能未獲支持。新集合庫滿足了這一條件,因?yàn)榻^大多數(shù)時(shí)候用到的類——ArrayList,LinkedList,HashList和HashMap,以及其他集合方案——都提供了對(duì)所有操作的支持。但是,假如想新建一個(gè)集合,同時(shí)不想為集合接口中的所有方法都提供有意義的定義,同時(shí)令其仍與現(xiàn)有庫配合,這種設(shè)計(jì)方法也確實(shí)提供了一個(gè)“后門”可以利用。
  (2) 若一個(gè)操作未獲支持,那么UnsupportedOperationException(未支持的操作違例)極有可能在實(shí)現(xiàn)期間出現(xiàn),則不是在產(chǎn)品已交付給客戶以后才會(huì)出現(xiàn)。它究竟指出的是一個(gè)編程錯(cuò)誤——不正確地使用了一個(gè)類。這一點(diǎn)不能十分確定,通過也可以看出這種方案的“試驗(yàn)”特征——只有經(jīng)過多次試驗(yàn),才能找出最理想的工作方式。
  
  在上面的例子中,Arrays.toList()產(chǎn)生了一個(gè)List(列表),該列表是由一個(gè)固定長(zhǎng)度的數(shù)組后推出來的。因此唯一能夠支持的就是那些不改變數(shù)組長(zhǎng)度的操作。在另一方面,若請(qǐng)求一個(gè)新接口表達(dá)不同種類的行為(可能叫作“FixedSizeList”——固定長(zhǎng)度列表),就有遭遇更大的復(fù)雜程度的危險(xiǎn)。這樣一來,以后試圖使用庫的時(shí)候,很快就會(huì)發(fā)現(xiàn)自己不知從何處下手。
  對(duì)那些采用Collection,List,Set或者M(jìn)ap作為參數(shù)的方法,它們的文檔應(yīng)當(dāng)指出哪些可選的方法是必須實(shí)現(xiàn)的。舉個(gè)例子來說,排序要求實(shí)現(xiàn)set()和Iterator.set()方法,但不包括add()和remove()。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 湖南省| 广昌县| 临安市| 永顺县| 余庆县| 阿图什市| 南岸区| 红桥区| 汉沽区| 阿克陶县| 永丰县| 黄浦区| 阜新| 望城县| 肇源县| 三原县| 永春县| 伊宁市| 社旗县| 台州市| 光泽县| 滦平县| 宜章县| 兴城市| 广德县| 梨树县| 泗阳县| 普兰店市| 临清市| 通州区| 麻栗坡县| 南宁市| 桂平市| 友谊县| 比如县| 石楼县| 五大连池市| 黄大仙区| 七台河市| 错那县| 凯里市|