java枚举简单分析
enum全称为enumeration,是JDK1.5中引入的新特性,位于包java.lang中。
在JDK1.5以前,我们通常使用接口来定义常量:
public interface IConstants { String ONE= "one"; String TWO= "two"; String THREE= "three";}
创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
基本原理:
首先编写一个简单的枚举示例:
package com.anxpp.demo;public enum EasySingleton{ ONE,TWO,THREE;}
这段代码实际上调用了3次 Enum(String name, int ordinal):
new Enum("ONE",0);new Enum ("TWO",1);new Enum ("THREE",2);
接下来,我们在控制台用javac命令编译EasySingleton.java:
javac C:\Users\u\Desktop\anxpp\Maven\Spring4Hibernate5MVC\src\test\java\com\anxpp\demo\SingleEnum.java
得到class文件,在使用javap命令反编译(加上参数-c可以得到更详细的反编译结果):
C:\Users\u>javap C:\Users\u\Desktop\anxpp\Maven\Spring4Hibernate5MVC\src\test\java\com\anxpp\demo\SingleEnum.classCompiled from "SingleEnum.java"public final class com.anxpp.demo.SingleEnum extends java.lang.Enum{ public static final com.anxpp.demo.SingleEnum ONE; public static final com.anxpp.demo.SingleEnum TWO; public static final com.anxpp.demo.SingleEnum THREE; public static com.anxpp.demo.SingleEnum[] values(); public static com.anxpp.demo.SingleEnum valueOf(java.lang.String); public static void main(java.lang.String[]); static {};}
可以看到,枚举实际也是一个class,并且是继承了java.lang.Enum的,枚举常量都申明为public static final类型,只不过使用enum关键字后,看上去有点不一样,所以我们使用enum时时不能使用extends关键字的,因为java是单继承的。
常用操作:
public enum SingleEnum{ ONE,TWO,THREE; public static void main(String args[]){ System.out.println("for循环遍历:"); for(SingleEnum singleEnum : SingleEnum.values()){ System.out.println(singleEnum); } System.out.println("switch的使用:"); SingleEnum singleEnum = SingleEnum.TWO; switch(singleEnum){ case ONE:System.out.println("这是1");break; case TWO:System.out.println("这是2");break; case THREE:System.out.println("这是3");break; default:System.out.println(singleEnum);break; } }}
输出:
for循环遍历:ONETWOTHREEswitch的使用:这是2
enum对象的常用方法:
int compareTo(E o) 比较此枚举与指定对象的顺序。
Class<E> getDeclaringClass() 返回与此枚举常量的枚举类型相对应的 Class 对象。
String name() 返回此枚举常量的名称,在其枚举声明中对其进行声明。
int ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
String toString() 返回枚举常量的名称,它包含在声明中。
static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) 返回带指定名称的指定枚举类型的枚举常量。
System.out.println(SingleEnum.ONE.compareTo(SingleEnum.TWO));//这里会输出-1,因为ONE在前面
可以给enum自定义属性和方法:
public enum SingleEnum{ ONE(1),THREE(3){ @Override public boolean isEven() { return false; } },TWO(2){ @Override public boolean isEven() { return true; } }; private int value; private SingleEnum(){} private SingleEnum(int value){ this.value = value; } public int getValue(){ return value; } public boolean isEven(){ return false; } public static void main(String args[]){ for(SingleEnum singleEnum : SingleEnum.values()){ System.out.println(singleEnum + ":" + singleEnum.isEven() + singleEnum.getValue()); } }}/*输出:ONE:false1THREE:false3TWO:true2*/
单例模式最佳实现方式:
/** * 枚举实现单利模式 * @author u * */public enum EasySingleton{ INSTANCE; /* * 其他代码 */ //获取实例方式 //EasySingleton.INSTANCE}
结论:
enum就是一个普通类,经过了编译器的优化,可以很好的实现单例模式。