一.模拟枚举
- 定义一个Week类,使用一个对象类型来表示固定的休息日的值,并私有化构造器,防止创建新的
Week对象。
新建EnumDemo.java
//模拟枚举
class Week
{
private Week(){
}
public static final Week MONDAy = new Week();
public static final Week TUESDAY = new Week();
public static final Week WEDESDAY = new Week();
public static final Week THURDAY = new Week();
public static final Week FRIDAY = new Week();
public static final Week SATURDAY = new Week();
public static final Week SUNDAY = new Week();
}
class Emplyoee
{
private Week restday;
Week getRestday(){
return restday;
}
void setRestday(Week restday){
this.restday = restday;
}
}
class EnumDemo
{
public static void main(String[] args)
{
Emplyoee e = new Emplyoee();
e.setRestday(Week.MONDAy);
Week restday = e.getRestday();
if(restday == Week.SATURDAY || restday == Week.SUNDAY){
System.out.println("在周末休息");
}else{
System.out.println("在周一到周五休息");
}
}
}
二.枚举的定义和特点
- 枚举是从Java5开始提供的一种新的数据类型,是一种特殊的类,就是固定的多个常量对象的集合。
定义格式:[修饰符] enum 枚举类名{
常量A,常量B,常量C;
}
- 枚举类的特点:
- 枚举的直接父类java.lang.Enum,但是不能显示继承Enum。
- 枚举就相当于一个类,可以定义构造方法,成员变量,普通方法和抽象方法。
- 默认私有的构造方法,即使不写访问权限也是private
- 每个实例分别用一个全局常量表示,枚举类的对象是固定的,实例个数有限,不能使用new关键字。
- 枚举实例必须位于枚举体中的最开始部分,枚举实例列表的后面要有分号,于其他成员向分隔。
- 枚举实例后有花括号时,该实例是枚举类的匿名内部类对象(查看编译后的class文件)
三. 枚举的使用
-
枚举中都是全局公共静态常量,可以直接使用枚举类名调用
Weekday day = Weekday.SATURDAY;
-
因为java.lang.Enum类是所以枚举类的父类,所以所有的枚举对象都可以调用Enum类中的方法。
String name = 枚举对象.name();//返回枚举对象的常量名称 String str = 枚举对象.toString();//返回枚举对象的常量名称 int ordinal = 枚举对象.ordina();//返回枚举对象的序号,从0开始
-
编译器生成的枚举类的静态方法:
枚举类型[] values(); Weekday[] wd = Weekday.values();返回当前枚举类型所有的常量,使用一个数组封装起来。 枚举类型[] valueOf(String name); Weekday day = Weekday.valueOf("MONDAY");//把一个指定名称字符串转换为当前枚举类中同 名的常量。
![image][use]
- 从Java5中开始出现枚举,switch也支持操纵枚举类型。
switch只支持int类型,支持枚举是因为底层使用的枚举对象的ordinal,而ordinald的类型依然是int类型。
四.枚举的单例模式
建议使用枚举类做单例模式,很安全,即使使用反射也不能创建对象。
//枚举的单例模式
enum ArrayUtil
{
INSTANCE;
//排序操作
public void sort(){
System.out.println("排序算法");
}
}
class EnumSingletonDemo
{
public static void main(String[] args)
{
ArrayUtil.INSTANCE.sort();
}
}