一、什么是枚举
枚举就是对某个类型的变量的取值只能为若干个固定值中的一个。
枚举是一个特殊的类,里面的变量是一个个内部类,其实就是子父类的关系。当有且仅有一个变量的时候,可看做是单例,但是单例没有子父类关系。
二、为什么要有枚举
枚举使 编译器在编译时期就控制源程序中填写的非法值,否则编译器就会报错。普通变量的方式在开发阶段无法实现这一目标。
三、模拟枚举的功能
public class Weekday {
public static final Weekday MON=new Weekday();
public static final Weekday TUE=new Weekday();
public static final Weekday WED=new Weekday();
public static final Weekday THU=new Weekday();
public static final Weekday FRI=new Weekday();
public static final Weekday SAT=new Weekday();
public static final Weekday SUN=new Weekday();
private Weekday(){}
public Weekday nextDay(){
if(this==MON){
return TUE;
}else if(this==TUE){
return WED;
}else if(this==WED){
return THU;
}else if(this==THU){
return FRI;
}else if(this==FRI){
return SAT;
}else if(this==SAT){
return SUN;
}else if(this==SUN){
return MON;
}else{
return null;
}
}
public String toString(){
if(this==MON){
return "MON";
}else if(this==TUE){
return "TUE";
}else if(this==WED){
return "WED";
}else if(this==THU){
return "THU";
}else if(this==FRI){
return "FRI";
}else if(this==SAT){
return "SAT";
}else if(this==SUN){
return "SUN";
}else{
return null;
}
}
}
用抽象方法可以将大量的if else语句转化为一个个独立的类。
public abstract class Weekday2 {
public static final Weekday2 MON=new Weekday2(){
public Weekday2 nextDay(){
if(this==MON){
return TUE;
}else{
return null;
}
}
};
public static final Weekday2 TUE=new Weekday2(){
public Weekday2 nextDay(){
if(this==TUE){
return WED;
}else{
return null;
}
}
};
public static final Weekday2 WED=new Weekday2(){
public Weekday2 nextDay(){
if(this==WED){
return THU;
}else{
return null;
}
}
};
public static final Weekday2 THU=new Weekday2(){
public Weekday2 nextDay(){
if(this==THU){
return FRI;
}else{
return null;
}
}
};
public static final Weekday2 FRI=new Weekday2(){
public Weekday2 nextDay(){
if(this==FRI){
return SAT;
}else{
return null;
}
}
};
public static final Weekday2 SAT=new Weekday2(){
public Weekday2 nextDay(){
if(this==SAT){
return SUN;
}else{
return null;
}
}
};
public static final Weekday2 SUN=new Weekday2(){
public Weekday2 nextDay(){
if(this==SUN){
return MON;
}else{
return null;
}
}
};
private Weekday2(){}
public abstract Weekday2 nextDay();
public String toString(){
if(this==MON){
return "MON";
}else if(this==TUE){
return "TUE";
}else if(this==WED){
return "WED";
}else if(this==THU){
return "THU";
}else if(this==FRI){
return "FRI";
}else if(this==SAT){
return "SAT";
}else if(this==SUN){
return "SUN";
}else{
return null;
}
}
}
四、定义一个枚举
public enum Weekday3 {
MON,TUE,WED,THU,FRI,SAT,SUN
}
枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
带构造方法的枚举,构造方法必须是私有的
public enum Weekday3 {
MON(1),TUE,WED,THU,FRI,SAT,SUN;
private Weekday3(){}
private Weekday3(int a){}
}
其中MON
(1)调用的是有参数的构造方法,而其他的都是调用无参的构造方法。
2、带有抽象方法的枚举,抽象方法被protected或者public修饰
public enum Weekday3 {
MON(1){
public Weekday3 nextDay(){
if(this==MON){
return TUE;
}else{
return null;
}
}
},TUE(){
public Weekday3 nextDay(){
if(this==TUE){
return WED;
}else{
return null;
}
}
},WED{
public Weekday3 nextDay(){
if(this==WED){
return THU;
}else{
return null;
}
}
},THU{
public Weekday3 nextDay(){
if(this==THU){
return FRI;
}else{
return null;
}
}
},FRI{
public Weekday3 nextDay(){
if(this==FRI){
return SAT;
}else{
return null;
}
}
},SAT{
public Weekday3 nextDay(){
if(this==SAT){
return SUN;
}else{
return null;
}
}
},SUN{
public Weekday3 nextDay(){
if(this==SUN){
return MON;
}else{
return null;
}
}
};
private Weekday3(){}
private Weekday3(int a){}
public abstract Weekday3 nextDay();
}
五、枚举中的方法
1、静态方法
类名.成员变量:直接调用
类名.valueOf(String 成员变量):将成员变量的字符串表现形式变成变量。
类名.values():返回一个包含成员变量的数组
2、非静态方法
name():返回变量的字符串表现形式,相当于toString();
ordinal():变量位于第几个位置,从0位置开始
values():同静态方法一致
valueOf(String 成员变量):同静态方法一致