---------------------- android培训、java培训、期待与您交流! ----------------------
JDK1.5新增了一个enum关键字,用来定义枚举类。枚举类其实就是一种特殊的Java类。
如何定义一个枚举类:
public class Twst {
public static void main(String[] args){
SeasonEnum summer = Enum.valueOf(SeasonEnum.class,\"SUMMER\");
// SeasonEnum spring = SeasonEnum.SPRING;
System.out.println(summer.ordinal());
}
public enum SeasonEnum{
SPING, SUMMER, FALL,WINTER(1) ; //大写的一般是实例值。注意的是构造方法,方法等都必须写在枚举值列表后面。
private final String name = \"season\";//小写的一般是属性;
private SeasonEnum(){System.out.println(\"无参构造方法\");}
private SeasonEnum(int i){System.out.println(\"有参构造方法\"+name);}
}
}
******************************************************************
运行结果: 无参构造方法
无参构造方法
无参构造方法
有参构造方法season
1
从运行结果来看,我们只是需要summer一个对象,但是枚举类里的所有枚举值都被执行了,也就是都被实例化了。这是为什么呢??
上面四个属性其实就是这个枚举类所有可能的枚举值。[季节只可能有春夏秋冬四个季节,所以我们就定义代表这四个季节的枚举值]
枚举类的构造器只能使用且必须使用private访问控制,private可以省略。【java的访问控制符有四个:public、protected、默认、private四个,这里我们如果不写private,并不表示访问控制符就是默认类型的,而仍然是private类型的。】。既然构造器都是私有的了,我们不可能再通过NEW关键字来创建该类的对象了。所以在定义枚举类时,一定要将所有可能用到的枚举值显示列出。
如果需要使用该枚举类的某个实例,可以使用枚举类名.枚举值的方式。如SessionEnum.SPRING的
所有枚举类都有一个values方法。用来返回该枚举类的所有实例。SessionEnum.values();
如果在其他类中需要使用到枚举类里的某个对象,这样来写:SessionEnum session = Enum.valueOf(SessionEnum.class , “FALL”);
枚举类通常应该设计成不可变类,也就是说它的属性值不应该允许改变,这样会更安全,而且代码更加简介。所以属性就应该使用private final 修饰,这样就只需要提供get方法而不再提供set方法了。既然使用了final修饰,属性值也就不能更改了。这就要求我们必须在构造器里为这些属性定义初始值(我们也可以在类中定义属性时给定默认值,但是这种情况意义不大)。如:public enum Gender{MALE(“男”),FEMALE(“女”)}(构造器里有几个参数,这里就应该提供几个对应的参数。)
其实MALE(”男”)等价于public static final Gender MALE = new Gender(“男”);