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

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

Java中的枚舉器(反復(fù)器)

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

  在任何集合類中,必須通過某種方法在其中置入對象,再用另一種方法從中取得對象。究竟,容納各種各樣的對象正是集合的首要任務(wù)。在Vector中,addElement()便是我們插入對象采用的方法,而elementAt()是提取對象的唯一方法。Vector非常靈活,我們可在任何時候選擇任何東西,并可使用不同的索引選擇多個元素。
  若從更高的角度看這個問題,就會發(fā)現(xiàn)它的一個缺陷:需要事先知道集合的準(zhǔn)確類型,否則無法使用。乍看來,這一點似乎沒什么關(guān)系。但假若最開始決定使用Vector,后來在程序中又決定(考慮執(zhí)行效率的原因)改變成一個List(屬于java1.2集合庫的一部分),這時又該如何做呢?
  可利用“反復(fù)器”(Iterator)的概念達(dá)到這個目的。它可以是一個對象,作用是遍歷一系列對象,并選擇那個序列中的每個對象,同時不讓客戶程序員知道或關(guān)注那個序列的基礎(chǔ)結(jié)構(gòu)。此外,我們通常認(rèn)為反復(fù)器是一種“輕量級”對象;也就是說,創(chuàng)建它只需付出極少的代價。但也正是由于這個原因,我們常發(fā)現(xiàn)反復(fù)器存在一些似乎很希奇的限制。例如,有些反復(fù)器只能朝一個方向移動。
  Java的Enumeration(枚舉,注釋②)便是具有這些限制的一個反復(fù)器的例子。除下面這些外,不可再用它做其他任何事情:
  (1) 用一個名為elements()的方法要求集合為我們提供一個Enumeration。我們首次調(diào)用它的nextElement()時,這個Enumeration會返回序列中的第一個元素。
  (2) 用nextElement()獲得下一個對象。
  (3) 用hasMoreElements()檢查序列中是否還有更多的對象。
  
  ②:“反復(fù)器”這個詞在C++和OOP的其他地方是經(jīng)常出現(xiàn)的,所以很難確定為什么Java的開發(fā)者采用了這樣一個希奇的名字。Java 1.2的集合庫修正了這個問題以及其他許多問題。
  
  只可用Enumeration做這些事情,不能再有更多。它屬于反復(fù)器一種簡單的實現(xiàn)方式,但功能依然十分強(qiáng)大。為體會它的運作過程,讓我們復(fù)習(xí)一下本章早些時候提到的CatsAndDogs.java程序。在原始版本中,elementAt()方法用于選擇每一個元素,但在下述修訂版中,可看到使用了一個“枚舉”:
  
  //: CatsAndDogs2.java
  // Simple collection with Enumeration
  import java.util.*;
  
  class Cat2 {
   PRivate int catNumber;
   Cat2(int i) {
    catNumber = i;
   }
   void print() {
    System.out.println("Cat number " +catNumber);
   }
  }
  
  class Dog2 {
   private int dogNumber;
   Dog2(int i) {
    dogNumber = i;
   }
   void print() {
    System.out.println("Dog number " +dogNumber);
   }
  }
  
  public class CatsAndDogs2 {
   public static void main(String[] args) {
    Vector cats = new Vector();
    for(int i = 0; i < 7; i++)
     cats.addElement(new Cat2(i));
    // Not a problem to add a dog to cats:
    cats.addElement(new Dog2(7));
    Enumeration e = cats.elements();
    while(e.hasMoreElements())
     ((Cat2)e.nextElement()).print();
    // Dog is detected only at run-time
   }
  } ///:~
  
  我們看到唯一的改變就是最后幾行。不再是:
  
  for(int i = 0; i < cats.size(); i++)
  ((Cat)cats.elementAt(i)).print();
  
  而是用一個Enumeration遍歷整個序列:
  
  while(e.hasMoreElements())
  ((Cat2)e.nextElement()).print();
  
  使用Enumeration,我們不必關(guān)心集合中的元素數(shù)量。所有工作均由hasMoreElements()和nextElement()自動照管了。
  下面再看看另一個例子,讓我們創(chuàng)建一個常規(guī)用途的打印方法:
  
  //: HamsterMaze.java
  // Using an Enumeration
  import java.util.*;
  
  class Hamster {
   private int hamsterNumber;
   Hamster(int i) {
    hamsterNumber = i;
   }
   public String toString() {
    return "This is Hamster #" + hamsterNumber;
   }
  }
  
  class Printer {
   static void printAll(Enumeration e) {
    while(e.hasMoreElements())
     System.out.println(
      e.nextElement().toString());
   }
  }
  
  public class HamsterMaze {
   public static void main(String[] args) {
    Vector v = new Vector();
    for(int i = 0; i < 3; i++)
     v.addElement(new Hamster(i));
    Printer.printAll(v.elements());
   }
  } ///:~
  
  仔細(xì)研究一下打印方法:
  
  static void printAll(Enumeration e) {
   while(e.hasMoreElements())
    System.out.println(
     e.nextElement().toString());
  }
  
  注重其中沒有與序列類型有關(guān)的信息。我們擁有的全部東西便是Enumeration。為了解有關(guān)序列的情況,一個Enumeration便足夠了:可取得下一個對象,亦可知道是否已抵達(dá)了末尾。取得一系列對象,然后在其中遍歷,從而執(zhí)行一個特定的操作——這是一個頗有價值的編程概念,本書許多地方都會沿用這一思路。
  這個看似非凡的例子甚至可以更為通用,因為它使用了常規(guī)的toString()方法(之所以稱為常規(guī),是由于它屬于Object類的一部分)。下面是調(diào)用打印的另一個方法(盡管在效率上可能會差一些):
  System.out.println("" + e.nextElement());
  它采用了封裝到Java內(nèi)部的“自動轉(zhuǎn)換成字串”技術(shù)。一旦編譯器碰到一個字串,后面跟隨一個“+”,就會希望后面又跟隨一個字串,并自動調(diào)用toString()。在Java 1.1中,第一個字串是不必要的;所有對象都會轉(zhuǎn)換成字串。亦可對此執(zhí)行一次造型,獲得與調(diào)用toString()同樣的效果:
  System.out.println((String)e.nextElement())
  但我們想做的事情通常并不僅僅是調(diào)用Object方法,所以會再度面臨類型造型的問題。對于自己感愛好的類型,必須假定自己已獲得了一個Enumeration,然后將結(jié)果對象造型成為那種類型(若操作錯誤,會得到運行期違例)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 97中文字幕在线观看 | 成人免费观看毛片 | 91精品国产一区二区在线观看 | 欧美高清在线精品一区二区不卡 | 欧美一级特黄aaaaaa在线看首页 | 国产欧美日韩视频在线观看 | 亚洲福利视频52 | 久久久成人免费视频 | 在线成人免费观看www | 国产精品视频免费在线观看 | 国产91在线播放九色 | 手机免费看一级片 | 成年人在线视频 | 性感美女一级毛片 | 黄色小视频在线免费看 | 成人毛片在线 | 在线a亚洲视频播放在线观看 | 羞羞视频免费入口网站 | www.99re1.com | 黄色av电影在线播放 | 欧美69free性videos | 久久久久久久黄色片 | 亚洲精品午夜国产va久久成人 | 亚洲国产高清自拍 | 欧美大屁股精品毛片视频 | 精品一区二区电影 | 久久精品伊人网 | 国产高潮失禁喷水爽到抽搐视频 | 日本网站在线播放 | 国产chinesehd精品91 | 亚洲小视频在线播放 | 久久精品久 | 日本在线免费观看 | 正在播放91精 | 日本欧美一区二区 | 日本不卡一区二区三区在线 | 国产69精品久久久久久久久久 | 国产一区二区国产 | 九九视频精品在线观看 | 一本在线高清码电影 | 国产精品免费久久久久 |