当一个java类的对象只有有穷多个而且很少的时候,我们常常把这个java类定义为enum,即枚举类,首先要明白使用enum定义的java类也是一个类。比如java.lang.Thread.State就是一个枚举类,看一下它的定义:
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
这是啥东西啊。enum它为何如此写法,是怎么演变过来的呢?我们完全可以使用一个class定义个类实现同样的功能。比如一个类有春夏秋冬四个对象,我们可以这样定义:
package cn.cms.test;
public class DefineEnum {
//为了更强调对象的不可修改,声明为final
private final String name;
private final String desc;
//枚举类对象就那几个,不能被自行创造,private
private DefineEnum(String name,String desc){
this.name=name;
this.desc=desc;
}
//一般直接通过类来调用,因此声明为static,不能被修改因此用final;SPRING是一个对象,不是一个值
public static final DefineEnum SPRING=new DefineEnum("春天", "春天是一年的开始");
public static final DefineEnum SUMMER=new DefineEnum("夏天", "夏天热死了");
public static final DefineEnum AUTEMN=new DefineEnum("秋天", "秋天收获");
public static final DefineEnum WINTER=new DefineEnum("冬天", "冬天很美");
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "DefineEnum [name=" + name + ", desc=" + desc + "]";
}
}
我们测试一下:
package cn.cms.test;
public class App1 {
public static void main(String[] args) {
DefineEnum spring = DefineEnum.SPRING;
System.out.println(spring.toString());
}
}
输出结果如下所示:DefineEnum [name=春天, desc=春天是一年的开始]
那么怎么把上边这个类改造成由enum声明的枚举类呢?改造后的enum类如下:
package cn.cms.test;
public enum DefineEnum2 {
SPRING("春天", "春天是一年的开始"),
SUMMER("夏天", "夏天热死了"),
AUTEMN("秋天", "秋天收获"),
WINTER("冬天", "冬天很美");
//为了更强调对象的不可修改,声明为final
private final String name;
private final String desc;
//枚举类对象就那几个,不能被自行创造,private
private DefineEnum2(String name,String desc){
this.name=name;
this.desc=desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "DefineEnum2 [name=" + name + ", desc=" + desc + "]";
}
}
那么我们再来调用一下,查看一下结果:
可以看到改造之后完全没有问题。那么enum到底该怎么写呢?有了上面的例子,我们可以做出总结说明了:
- 枚举类通过enum来定义,而不是class
- 声明的对象必须放最前面,否则会报错。每一个枚举对象之间通过","隔开,最后一个加上";"。对于任一个枚举对象比如SPRING来说,它是通过对public static final DefineEnum2 SPRING=new DefineEnum2("春天", "春天是一年的开始");的简化而来,即SPRING其实就是省略了public static final DefineEnum2以及=new DefineEnum2之后直接变成了SPRING("春天", "春天是一年的开始"),也就是说枚举对象的声明要“去掉默认的东西”,就像interface里面的方法的定义可以省略掉public一样。
- 这是有属性(name,desc)的枚举类,否则直接就是SPRING,SUMMER....的方式定义枚举对象