Java高新技術之列舉
阿新 • • 發佈:2019-02-17
一、為什麼要有列舉?
列舉就是要讓某個型別的變數的取值只能為若干個固定值中的一個,否則,編譯器就會報錯。列舉可以讓編譯器在編譯時就可以控制源程式中填寫的非法值,普通變數的方式在開發階段無法實現這一目標。
二、普通類模擬實現列舉
- 私有的構造方法
- 每個元素分別用一個公有的靜態成員變量表示
- 可以有若干公有方法或抽象方法。採用抽象方法定義nextDay就將大量的if.else語句轉移成了一個個獨立的類。
public class EnumTest { public static void main(String[] args) { WeekDay weekday=WeekDay.MON; System.out.println(weekday); System.out.println(weekday.nextDay()); } } 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帶構造方法的列舉
- 構造方法必須定義成私有的
- 如果有多個構造方法,該如何選擇哪個構造方法?
- 列舉元素MON和MON()的效果一樣,都是呼叫預設的構造方法。
- 定義列舉TrafficLamp
- 實現普通的next方法
- 實現抽象的next方法:每個元素分別是由列舉類的子類來生成的例項物件,這些子類採用類似內部類的方式進行定義。
- 增加上表示時間的構造方法
public class EnumTest { public static void main(String[] args) { WeekDay day=WeekDay.TUI; System.out.println(day); System.out.println(day.compareTo(WeekDay.FRI)); System.out.println(day.ordinal()); System.out.println(day.name()); //列舉的靜態方法 System.out.println(WeekDay.valueOf("SUN"));//引數必須是列舉的元素 否則IllegalArgumentException System.out.println(WeekDay.values().length); System.out.println("--------------"); 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 { SUN(),MON,TUE(3),WED,TUI,FRI,SAT;//列舉元素必須放在首行 private WeekDay(){System.out.println("無參構造");};//構造方法必須是private private WeekDay(int day){System.out.println("有參構造");} } //定義一個交通燈的列舉類 public enum TrafficLamp { RED(30){ public TrafficLamp nextLamp() { return GREEN; } } , GREEN(45){ public TrafficLamp nextLamp() { return YELLOW; } }, YELLOW(10) { public TrafficLamp nextLamp() { return RED; } }; private int time=0;//設定紅綠藍燈的時間 private TrafficLamp(int time)//構造方法傳入時間 { this.time=time; } public abstract TrafficLamp nextLamp();//下一個燈 public String toString()//重寫toString方法 { if(this==RED) return "紅燈"; else if(this==GREEN) return "綠燈"; else return "黃燈"; } } }