爲什麼要有枚舉
- 問題:要定義星期幾或性別的變量,該怎麼定義?假設用1-7分別表示星期一星期日,但有人可能會寫成int weekday =0
- 枚舉就是要讓某個類型的變量的取值只能爲若干個固定值中的一個,否則,編譯器就會報錯。枚舉可以讓編譯器在編譯時就可以控制源程序中填寫的非法值,普通變量的方式在開發階段無法實現這一目標。
- 私有的構造方法
- 每個元素分別用一個公有的靜態成員變量表示
- 可以有若干公有方法或抽象方法,例如,要提供nextDay方法必須是抽象的。
我們現在來思考這樣的應用,每一個星期得到這個對象後都可以調用它的nextDay方法來得到下一天是星期幾,先想到的是下面的代碼:
爲了演示方便我將星期定位兩天。
package cn.itcast.day1;
public class CopyOfWeekDay1
{
private CopyOfWeekDay1()
{
}
public final static CopyOfWeekDay1 SUN = new CopyOfWeekDay1();
public final static CopyOfWeekDay1 MON = new CopyOfWeekDay1();
public CopyOfWeekDay1 nextDay()
{
if (this == SUN)
{
return MON;
} else
{
return SUN;
}
}
}
測試類如下:
package cn.itcast.day1;
import java.util.Date;
public class CopyOfEnumTest
{
public static void main(String[] args)
{
CopyOfWeekDay1 weekDay = CopyOfWeekDay1.MON;
System.out.println(weekDay.nextDay());
}
}
由於如果採用上面的方法構建枚舉,nextDay會有大量的if{}else{}語句塊,爲了方便現在又該如下:
package cn.itcast.day1;
public abstract class WeekDay2
{
private WeekDay2()
{
}
public final static WeekDay2 SUN = new WeekDay2()
{
@Override
public WeekDay2 nextDay()
{
return MON;
}
};
public final static WeekDay2 MON = new WeekDay2()
{
@Override
public WeekDay2 nextDay()
{
return SUN;
}
};
public abstract WeekDay2 nextDay();
public String toString()
{
return this == SUN ? "SUN" : "MON";
}
}
把該類定義爲一個抽象類,公有的方法也定義爲抽象的,接下來使用匿名內部類產生實例對象覆蓋抽象方法。
總結:枚舉是一種特殊的類,其中每個元素都是該類的一個實例對象,例如可以調用WeekDay.SUN.getClass().getName()和WeekDay.class.getName().
我們來這樣定義一個枚舉:
public enum WeekDay{
SUN,MON,TUE,WED,THI,FRI,SAT
}
我們可以使用枚舉類給我們提供的方法:
WeekDay weekDay2 = WeekDay.FRI;
System.out.println(weekDay2);
System.out.println(weekDay2.name());
System.out.println(weekDay2.ordinal());
System.out.println(WeekDay.valueOf("SUN").toString());
System.out.println(WeekDay.values().length);
我們在枚舉類中定義的方法都必須放在元素列表之後,記住加;號。
我們可以實現帶構造方法的枚舉:
- 構造方法必須定義成私有的
- 如果有多個構造方法,如果有多個構造方法,該如何選擇哪個構造方法?
- 枚舉元素MON和MON()的效果一樣,都是調用默認的構造方法。
public enum WeekDay
{
SUN(1),MON(),TUE,WED,THI,FRI,SAT;
private WeekDay(){System.out.println("first");}
private WeekDay(int day){System.out.println("second");}
}
實現帶有抽象方法的枚舉:
首先我們先定義如下:
public enum TrafficLamp{
RED,GREEN,YELLOW;
public abstract TrafficLamp nextLamp();
}
然後實現方法,因爲每一個元素就是一個該枚舉類的實例對象,所以我們可以這樣實現:
public 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;}
}
上面的枚舉還分別爲各種燈定義了時間。
枚舉就相當於一個類,其中也可以定義構造方法、成員變量、普通方法和抽象方法。
枚舉元素必須位於枚舉體中最開始的部分,枚舉元素列表的後面要有分號與其他成員分隔。
枚舉只有一個成員時,就可以作爲一種單例的實現方式。