枚舉

寫在之前

以下是《Java8編程入門官方教程》中的一些知識(shí),如有錯(cuò)誤爱葵,煩請(qǐng)指正施戴。涉及的程序如需下載請(qǐng)移步http://down1.tupwk.com.cn/qhwkdownpage/978-7-302-38738-1.zip

枚舉

定義新的數(shù)據(jù)類型的命名常量列表。一般使用枚舉常量使用大寫萌丈。這是因?yàn)槊杜e經(jīng)常代替final變量赞哗,而final變量通常是大寫的,所以程序員自然也習(xí)慣對(duì)枚舉常量使用大寫辆雾。Java將枚舉實(shí)現(xiàn)為類類型肪笋,盡管不會(huì)使用new實(shí)例化枚舉,但是可以給枚舉提供構(gòu)造函數(shù)度迂,添加實(shí)例變量和方法藤乙,甚至實(shí)現(xiàn)接口。

// 枚舉的創(chuàng)建和基本應(yīng)用

// 聲明一個(gè)枚舉
enum Transport {  
  CAR, TRUCK, AIRPLANE, TRAIN, BOAT //枚舉常量
} 
 
class EnumDemo { 
  public static void main(String args[])  
  { 
    Transport tp; //聲明一個(gè)Transport引用
 
    tp = Transport.AIRPLANE;    //為tp賦值常量AIRPLANE
 
    // Output an enum value. 
    System.out.println("Value of tp: " + tp); 
    System.out.println(); 
 
    tp = Transport.TRAIN; 
 
    // Compare two enum values. 
    if(tp == Transport.TRAIN)  //比較兩個(gè)Transport對(duì)象是否相等
      System.out.println("tp contains TRAIN.\n"); 
 
    //使用枚舉控制switch語(yǔ)句
    switch(tp) { 
      case CAR: 
        System.out.println("A car carries people."); 
        break; 
      case TRUCK: 
        System.out.println("A truck carries freight."); 
        break; 
      case AIRPLANE:  
        System.out.println("An airplane flies."); 
        break; 
      case TRAIN: 
        System.out.println("A train runs on rails."); 
        break; 
      case BOAT: 
        System.out.println("A boat sails on water."); 
        break; 
    } 
  } 
}

value()和valueOf()方法

所有枚舉類型自動(dòng)定義以上兩種方法惭墓。

public static enum-type[] values()//返回一個(gè)枚舉常量列表數(shù)組
public static enum-type[] valuesOf(String str)//返回一個(gè)枚舉常量坛梁,傳遞給字符串
// Use the built-in enumeration methods. 
 
// An enumeration of Transport varieties. 
enum Transport {  
  CAR, TRUCK, AIRPLANE, TRAIN, BOAT 
} 
 
class EnumDemo2 { 
  public static void main(String args[])  
  { 
    Transport tp; 
 
    System.out.println("Here are all Transport constants"); 
 
    // use values() 
    Transport allTransports[] = Transport.values(); 
    for(Transport t : allTransports) 
      System.out.println(t); 
 
    System.out.println(); 
    
    // use valueOf() 
    tp = Transport.valueOf("AIRPLANE"); 
    System.out.println("tp contains " + tp); 
 
  } 
}

構(gòu)造函數(shù)、方法腊凶、實(shí)例變量和枚舉

枚舉常量都是一個(gè)其枚舉類型的對(duì)象划咐。

枚舉和final共存:枚舉適合必須由標(biāo)識(shí)符表示的條目列表的情況;final變量適合于常量值可用于多處地方的情況吭狡。

兩點(diǎn)限制:枚舉不能繼承另一個(gè)類尖殃;enum不能是超類。

// Use an enum constructor, instance variable, and method.  
enum Transport {  
  CAR(65), TRUCK(55), AIRPLANE(600), TRAIN(70), BOAT(22);  
  
  private int speed; // typical speed of each transport   添加一個(gè)實(shí)例變量
  
  // Constructor  
  Transport(int s) { speed = s; }  
  
  int getSpeed() { return speed; }  //添加一個(gè)方法
}  
  
class EnumDemo3 {  
  public static void main(String args[])   
  {  
    Transport tp;  
  
    // Display speed of an airplane.  
    System.out.println("Typical speed for an airplane is " +  
                       Transport.AIRPLANE.getSpeed() +  
                       " miles per hour.\n");  
  
    // Display all Transports and speeds.  
    System.out.println("All Transport speeds: ");  
    for(Transport t : Transport.values())  
      System.out.println(t + " typical speed is " + 
                         t.getSpeed() +  
                         " miles per hour.");  
  }  
}

枚舉繼承enum

所有枚舉都自動(dòng)繼承java.lang.Enum划煮,定義了很多方法送丰,可供所有枚舉使用,下面介紹最為常用的兩個(gè)弛秋。

final int ordinal()     //返回枚舉常量的順序值
final int compareTo(enum-type e)    //比較同一個(gè)枚舉中兩個(gè)枚舉常量的順序值
// Demonstrate ordinal() and compareTo(). 
 
// An enumeration of Transport varieties. 
enum Transport {  
  CAR, TRUCK, AIRPLANE, TRAIN, BOAT 
} 
 
class EnumDemo4 { 
  public static void main(String args[])  
  { 
    Transport tp, tp2, tp3; 
 
    // Obtain all ordinal values using ordinal(). 
    System.out.println("Here are all Transport constants" + 
                       " and their ordinal values: "); 
    for(Transport t : Transport.values()) 
      System.out.println(t + " " + t.ordinal()); 
 
    tp =  Transport.AIRPLANE; 
    tp2 = Transport.TRAIN; 
    tp3 = Transport.AIRPLANE; 
 
    System.out.println(); 
 
    // Demonstrate compareTo() 
    if(tp.compareTo(tp2) < 0) 
      System.out.println(tp + " comes before " + tp2); 
 
    if(tp.compareTo(tp2) > 0) 
      System.out.println(tp2 + " comes before " + tp); 
 
    if(tp.compareTo(tp3) == 0) 
      System.out.println(tp + " equals " + tp3); 
  } 
}

為了加深理解器躏,看一個(gè)更加具體使用的例子--使用計(jì)算機(jī)控制交通燈

// A simulation of a traffic light that uses 
// an enumeration to describe the light's color. 
 
// An enumeration of the colors of a traffic light. 
enum TrafficLightColor {  
  RED, GREEN, YELLOW 
} 
 
// A computerized traffic light. 
class TrafficLightSimulator implements Runnable { 
  private Thread thrd; // holds the thread that runs the simulation 
  private TrafficLightColor tlc; // holds the current traffic light color 
  boolean stop = false; // set to true to stop the simulation 
  boolean changed = false; // true when the light has changed
 
  TrafficLightSimulator(TrafficLightColor init) {  
    tlc = init; 
 
    thrd = new Thread(this); 
    thrd.start(); 
  } 
 
  TrafficLightSimulator() {  
    tlc = TrafficLightColor.RED; 
 
    thrd = new Thread(this); 
    thrd.start(); 
  } 
 
  // Start up the light. 
  public void run() { 
    while(!stop) { 
      try { 
        switch(tlc) { 
          case GREEN: 
            Thread.sleep(10000); // green for 10 seconds 
            break; 
          case YELLOW: 
            Thread.sleep(2000);  // yellow for 2 seconds 
            break; 
          case RED: 
            Thread.sleep(12000); // red for 12 seconds 
            break; 
        } 
      } catch(InterruptedException exc) { 
        System.out.println(exc); 
      } 
      changeColor(); 
    }  
  } 
 
  // Change color. 
  synchronized void changeColor() { 
    switch(tlc) { 
      case RED: 
        tlc = TrafficLightColor.GREEN; 
        break; 
      case YELLOW: 
        tlc = TrafficLightColor.RED; 
        break; 
      case GREEN: 
       tlc = TrafficLightColor.YELLOW; 
    } 
 
    changed = true;
    notify(); // signal that the light has changed 
  } 
 
  // Wait until a light change occurs. 
  synchronized void waitForChange() { 
    try { 
      while(!changed) 
        wait(); // wait for light to change 
      changed = false;
    } catch(InterruptedException exc) { 
      System.out.println(exc); 
    } 
  } 
 
  // Return current color. 
  synchronized TrafficLightColor getColor() { 
    return tlc; 
  } 
 
  // Stop the traffic light. 
  synchronized void cancel() { 
    stop = true; 
  } 
}  
  
class TrafficLightDemo {  
  public static void main(String args[]) {  
    TrafficLightSimulator tl =
      new TrafficLightSimulator(TrafficLightColor.GREEN); 
 
    for(int i=0; i < 9; i++) { 
      System.out.println(tl.getColor()); 
      tl.waitForChange(); 
    } 
 
    tl.cancel(); 
  }  
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蟹略,隨后出現(xiàn)的幾起案子登失,更是在濱河造成了極大的恐慌,老刑警劉巖挖炬,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揽浙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡意敛,警方通過(guò)查閱死者的電腦和手機(jī)馅巷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)草姻,“玉大人钓猬,你說(shuō)我怎么就攤上這事×枚溃” “怎么了敞曹?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵账月,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我澳迫,道長(zhǎng)局齿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任橄登,我火速辦了婚禮项炼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘示绊。我一直安慰自己,他們只是感情好暂论,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布面褐。 她就那樣靜靜地躺著,像睡著了一般取胎。 火紅的嫁衣襯著肌膚如雪展哭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天闻蛀,我揣著相機(jī)與錄音匪傍,去河邊找鬼。 笑死觉痛,一個(gè)胖子當(dāng)著我的面吹牛役衡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播薪棒,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼手蝎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了俐芯?” 一聲冷哼從身側(cè)響起棵介,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吧史,沒(méi)想到半個(gè)月后邮辽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贸营,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年吨述,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莽使。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锐极,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芳肌,到底是詐尸還是另有隱情灵再,我是刑警寧澤肋层,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站翎迁,受9級(jí)特大地震影響栋猖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜汪榔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一蒲拉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧痴腌,春花似錦雌团、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至剥悟,卻和暖如春灵寺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背区岗。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工略板, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人慈缔。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓叮称,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親藐鹤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子颅拦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容