当一个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 + "]";
	}
}


那么我们再来调用一下,查看一下结果:

java 枚举返回对应对象 java枚举enum_enum

可以看到改造之后完全没有问题。那么enum到底该怎么写呢?有了上面的例子,我们可以做出总结说明了:

  1. 枚举类通过enum来定义,而不是class
  2. 声明的对象必须放最前面,否则会报错。每一个枚举对象之间通过","隔开,最后一个加上";"。对于任一个枚举对象比如SPRING来说,它是通过对public  static final DefineEnum2 SPRING=new DefineEnum2("春天", "春天是一年的开始");的简化而来,即SPRING其实就是省略了public  static final DefineEnum2以及=new DefineEnum2之后直接变成了SPRING("春天", "春天是一年的开始"),也就是说枚举对象的声明要“去掉默认的东西”,就像interface里面的方法的定义可以省略掉public一样。
  3. 这是有属性(name,desc)的枚举类,否则直接就是SPRING,SUMMER....的方式定义枚举对象