您的位置:首页 > 编程语言 > Java开发

Java高新技术-枚举

2014-03-03 22:44 190 查看
说明:当一个类的对象个数固定,且不需要再创建这个类新的对象时,可以考虑用枚举。

一,枚举原理

枚举类型特有:

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(){};
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: