java枚举分析

来源:互联网 发布:asp和php网站的区别 编辑:程序博客网 时间:2024/05/20 11:49

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<EnumTest>("ONE",0);new Enum<EnumTest>("TWO",1);new Enum<EnumTest>("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<com.anxpp.demo.SingleEnum> {  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就是一个普通类,经过了编译器的优化,可以很好的实现单例模式。

 

1 0
原创粉丝点击