java高新技術:列舉
阿新 • • 發佈:2019-02-01
為什麼會有列舉?
列舉就是要讓某個型別的變數的取值只能為若干個固定值中的一個,否則,編譯器就會報錯。列舉可以讓編譯器在編譯時就可以控制源程式中填寫的非法值,普通變數的方式在開發階段無法實現這一目標。
普通類模擬實現列舉:
public abstract class WeekDay { private WeekDay(){};//構造方法私有化 public static final WeekDay SUN=new WeekDay() { public WeekDay nextDay() { return MON; } }; public static final WeekDay MON=new WeekDay() { public WeekDay nextDay() { return SUN; } }; // public WeekDay nextDay() // { // if(this==SUN) // return MON; // else // return SUN; // } public abstract WeekDay nextDay(); public String toString() { return this==SUN?"SUN":"MON"; } }
列舉的應用:
列舉就相當於一個類,其中也可以定義構造方法、成員變數、普通方法和抽象方法。
列舉元素必須位於列舉體中的最開始部分,列舉元素列表的後要有分號與其他成員分隔。把列舉中的成員方法或變數等放在列舉元素的前面,編譯器報告錯誤。
3.1帶構造方法的列舉3.2帶方法的列舉
- 構造方法必須定義成私有的
- 如果有多個構造方法,該如何選擇哪個構造方法?
- 列舉元素MON和MON()的效果一樣,都是呼叫預設的構造方法。
3.3列舉只有一個成員時,就可以作為一種單例的實現方式。
- 定義列舉TrafficLamp
- 實現普通的next方法
- 實現抽象的next方法:每個元素分別是由列舉類的子類來生成的例項物件,這些子類採用類似內部類的方式進行定義。
- 增加上表示時間的構造方法
package EnumDemo; /* * 列舉相當於一個類,其中也可以定義構造方法,成員變數、普通方法和抽象方法 * * 列舉元素必須位於列舉體中的最開始部分,列舉元素列表的後面要有分號語氣其他成員隔開, * 把列舉中的成員方法或變數,等放在列舉元素的前面,編譯器報告錯誤 * * 帶構造方法的列舉 * --構造方法必須定義成私有的 * --如果有多個構造方法,該如何選擇哪個構造方法?在元素後面跟上一個括號然後可以選擇有參或者無參的建構函式 * --列舉元素MON和MON()的效果一樣,都是呼叫預設的構造方法 * * 帶方法的列舉 * --定義列舉TrafficLamp * --實現普通的next方法 * --實現抽象的next方法,每個元素分別是由列舉類的子類來生成子類例項物件,這些子類才有類似內部誒的方式定義 * --增加上表示時間的構造方法 * */ public class enumDay { public static void main(String[] args) { //WeekDay w = WeekDay.AAA; /* System.out.println(w); System.out.println(w.name()); System.out.println(w.ordinal()); //返回列舉的序數 System.out.println(WeekDay.valueOf("CCC")); //返回帶指定名稱的列舉常量 System.out.println(WeekDay.values().length); */ TrafficLamp red = TrafficLamp.RED; TrafficLamp green = TrafficLamp.GREEN ; TrafficLamp yellow = TrafficLamp.YELLOW ; System.out.println(red.nextLamp()); System.out.println(green.nextLamp()); System.out.println(yellow.nextLamp()); } public enum WeekDay { AAA,BBB,CCC,DDD,EEE,FFF,GGG; private WeekDay() { System.out.println("空參建構函式"); } } //交通燈示例: public enum TrafficLamp { RED(10) { public TrafficLamp nextLamp() { return GREEN; } }, GREEN(20) { public TrafficLamp nextLamp() { return YELLOW; } }, YELLOW(5) { public TrafficLamp nextLamp() { return RED; } }; public abstract TrafficLamp nextLamp(); //定義一個抽象方法 private TrafficLamp(int time) //建構函式必須是私有的,物件一建立所有方法都初始化 { System.out.println(time); } } }