java枚举分析

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.class
Compiled 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循环遍历:
ONE
TWO
THREE
switch的使用:
这是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:false1
THREE:false3
TWO:true2
*/


    单例模式最佳实现方式:

/**
 * 枚举实现单利模式
 * @author u
 *
 */
public enum EasySingleton{
    INSTANCE;
    /*
     * 其他代码
     */
    //获取实例方式
    //EasySingleton.INSTANCE
}

 

    结论:

    enum就是一个普通类,经过了编译器的优化,可以很好的实现单例模式。

 

阅读更多
版权声明:http://blog.csdn.net/anxpp https://blog.csdn.net/anxpp/article/details/50672838
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭