Java高新技術-列舉
阿新 • • 發佈:2019-01-29
說明:當一個類的物件個數固定,且不需要再建立這個類新的物件時,可以考慮用列舉。
一,列舉原理
列舉型別特有:
1.私有構造方法;
2.每個元素分別用一個公有的靜態成員變量表示;
3.可以有若干個公有方法或抽象方法,抽象方法可以使每個元素(本類物件)通過覆蓋具有自己獨特的內容;
注:列舉型別的元素就是本類物件,但是限制了使用者自己創新的物件,只能使用該類提供的物件->元素。
列舉是為了讓這個型別的變數的取值只能為若干固定值中的一個。
列舉程式碼原理舉例一:
class Weekday{ //私有構造方法可以防止外部建立本類新物件; //保證建立個數; private Weekday(){}; //通過公有靜態的本類物件的成員,為外部提供了獲取該類物件的途徑; //而且本類物件個數是可控,確定。 public static Weekday MONDAY=new Weekday(); public static Weekday TUESDAY=new Weekday(); public static Weekday WEDNESDAY=new Weekday(); public static Weekday THURSDAY=new Weekday(); public static Weekday FRIDAY=new Weekday(); public static Weekday SATURDAY=new Weekday(); public static Weekday SUNDAY=new Weekday(); public Weekday nextDay(){ /*本方法為非靜態方法,當外部通過如 * Weekday today=Weeday.FRIDAY; * 獲取到本類物件後,就可以通過物件呼叫非靜態方法 */ if(this==MONDAY) return TUESDAY; if(this==TUESDAY) return WEDNESDAY; if(this==WEDNESDAY) return THURSDAY; if(this==THURSDAY) return FRIDAY; if(this==FRIDAY) return SATURDAY; //if(this==SATURDAY) return SUNDAY; } public String toString(){ if(this==MONDAY) return "MONDAY"; if(this==TUESDAY) return "TUESDAY"; if(this==WEDNESDAY) return "WEDNESDAY"; if(this==THURSDAY) return "THURSDAY"; if(this==FRIDAY) return "FRIDAY"; if(this==SATURDAY) return "SATURDAY"; return "SUNDAY"; } }
列舉程式碼原理舉例二:
因為對於Weekday類物件,每一個nextDay方法對應的結果都是不同而且固定的,這裡可以採用將nextDay變為抽象方法,在建立元素時通過覆蓋nextDay方法,將該方法返回值設為需要的指定結果。這樣避免你了上面例子中多個if...else...的語句重複選擇。
abstract class Weekday{ //私有構造方法可以防止外部建立本類新物件; //保證建立個數; private Weekday(){}; //通過公有靜態的本類物件的成員,為外部提供了獲取該類物件的途徑; //而且本類物件個數是可控,確定。 public static Weekday MONDAY=new Weekday(){ public Weekday nextDay(){ return TUESDAY; } }; public static Weekday TUESDAY=new Weekday(){ public Weekday nextDay(){ return WEDNESDAY; } }; public static Weekday WEDNESDAY=new Weekday(){ public Weekday nextDay(){ return THURSDAY; } }; public static Weekday THURSDAY=new Weekday(){ public Weekday nextDay(){ return FRIDAY; } }; public static Weekday FRIDAY=new Weekday(){ public Weekday nextDay(){ return SATURDAY; } }; public static Weekday SATURDAY=new Weekday(){ public Weekday nextDay(){ return SUNDAY; } }; public static Weekday SUNDAY=new Weekday(){ public Weekday nextDay(){ return MONDAY; } }; public String toString(){ if(this==MONDAY) return "MONDAY"; if(this==TUESDAY) return "TUESDAY"; if(this==WEDNESDAY) return "WEDNESDAY"; if(this==THURSDAY) return "THURSDAY"; if(this==FRIDAY) return "FRIDAY"; if(this==SATURDAY) return "SATURDAY"; return "SUNDAY"; } }
二,列舉
下面介紹列舉的應用。
示例1:列舉常見方法
在一個類內建立一個列舉,此時列舉類內部類,可以用成員修飾詞來修飾。
public class Test { public static void main(String[] args) throws Exception{ //獲取列舉元素方法。 Weekday today=Weekday.MON; //獲取元素在列舉中的位置 System.out.println(today.ordinal()); //獲取元素的列舉類名 System.out.println(today.getClass()); //通過名稱獲取列舉的指定元素 System.out.println(Weekday.valueOf("FRI")); //獲取列舉中所有元素 Weekday[] days=Weekday.values(); } public enum Weekday{ //元素名稱必須寫在列舉類的第一行 SUN(),MON(1),TUE,WED,THU,FRI,SAT; //構造方法不寫,如果要構造方法,則必須修飾為私有private; private Weekday(){ System.out.println("無參建構函式"); } /*當喲多個構造方法時,可以在元素後面加(); *並在()內根據構造方法的形參格式傳值; *就會呼叫相應的構造方法 *如元素後面不加(),則預設呼叫無參建構函式 */ private Weekday(int a){ System.out.println("有參建構函式"+a); } public String toString(){ if(this==MON) return "MONDAY"; if(this==TUE) return "TUESDAY"; if(this==WED) return "WEDNESDAY"; if(this==THU) return "THURSDAY"; if(this==FRI) return "FRIDAY"; if(this==SAT) return "SATURDAY"; return "SUNDAY"; } } }
示例2:包含抽象方法的列舉
在類內建立列舉時(即內部類列舉)如果列舉裡有抽象方法,列舉類名前不需要加abstract關鍵詞,列舉中每個元素要重寫該抽象方法。
enum TrafficLamp{
RED(30){
//元素需要重寫列舉方法
public TrafficLamp nextLamp(){
return GREEN;
}
},
GREEN(45){
public TrafficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp(){
return RED;
}
};
//列舉中的抽象方法
public abstract TrafficLamp nextLamp();
private int time;
//列舉中的有參函式
private TrafficLamp(int time){this.time = time;}
}
示例3:列舉只有一個成員是,就可以作為一種單例的實現方式
enum Student{
LiSi;
//私有建構函式
private Student(){};
}