1.基本使用
JDK API在1.5版本以前只能用接口定义常量,这也是初级程序员比较熟知的方式,比如:
public interface Season {
public static final int SPRING = 0;
public static final int SUMMER = 1;
public static final int AUTUMN = 2;
public static final int WINTER = 3;
}
这已经比大多数硬编码的马畜好很多了嘛,不过JDK1.5以后推荐使用一种的优雅方式定义常量就是枚举。比如上面的代码就可以这样修改:
public enum Season {
Spring,Summer,Autumn,Winter;
}
是不是简洁了很多,不止如此还有如下好处:
-
1.编译期间限定类型,不会发生越界
例如:
public void toColor(int season){
switch (season){
case Season.SPRING:
System.out.println("绿色");
break;
case Season.SUMMER:
System.out.println("红色");
break;
case Season.AUTUMN:
System.out.println("白色");
break;
case Season.WINTER:
System.out.println("黑色");
break;
default:
System.out.println("错误!");
break;
}
}
接口定义的常量有具体类型,在运行时才会发现越界情况,要么提前判断范围,要么运行时做好异常处理;如果改为enum类型,在编译期就会锁定变量范围,上面代码就不需要default处理。
-
2.enum类型有内置方法
每个枚举都是java.lang.Enum的子类,该基类提供了诸如获得排序值的ordinal方法、compareTo比较方法等,大大简化了常量的访问。比如,列出所有枚举值:
public static void main(String[] args){
for(Season s:Season.values()){
System.out.println(s);
}
}
-
3.enum类型的高级用法
枚举类型可以通过成员变量和构造方法来定义复杂的常量类型。枚举类型的基本想法是:通过共有的静态final域为每个枚举常量导出一个实例。枚举类型没有可以访问的构造器,客户端不能创建枚举类型的实例,也不能对它进行扩展,因此只存在声明过程的枚举常量。也就是枚举类型是实例受控的。枚举是单例的范型化,单例的本质是单元素的枚举。示例:
public enum StatusPublicEnum {
//多个实例用逗号分隔,必须写在构造方法前面
FAIL("失败", "300", "认证系统"),
OK("成功", "200", "认证系统");
private final String msg;
private final String status;
private final String code;
StatusPublicEnum(String msg, String status, String code) {
this.msg = msg;
this.status = status;
this.code = code;
}
public String toJson() throws Exception {
JSONObject jsonObject = new JSONObject();
jsonObject.put("msg",this.msg);
jsonObject.put("status",this.status);
jsonObject.put("code",this.code);
return jsonObject.toCompactString();
}
public static void main(String[] args) throws Exception {
System.out.println(StatusPublicEnum.FAIL.toJson());
System.out.println(StatusPublicEnum.OK.toJson());
}
}