Java基础 之 枚举类型

2013/03/21 Java

枚举类型的常见使用场景:

枚举类型 作为 错误码集合:

public enum ErrorEnum {
    TFS_ACCESS_ERROR("101", "TFS连接失败")
    /**
     * 错误代码
     */
    private String errorCode
    /**
     * 错误消息
     */
    private String errorMsg;
    ErrorEnum(String errorCode, String errorMsg){
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    

定义的枚举 属性都是 枚举类型,这个枚举类型每一个错误吗会对应一个 错误信息;

使用 枚举类型enum 构建一个状态机:

利用enum可以为枚举实例添加方法的特性,可以构造状态机。

package enumeration;
public class Person {
    //自己有一个状态
    private State s;
    public Person(State s){this.s = s;}
    //调用相应状态下的方法
    public void smile(){
        s.smile();
    };

    public void cry(){
        s.cry();
    };
}

//状态
enum State {
    //高兴状态下的方法实现
    Happy {
        @Override
        public void smile() {
            System.out.println("Happy Smile");
        }

        @Override
        public void cry() {
            System.out.println("Happy cry");
        }
    },
    //悲伤状态下的方法实现
    Sad {
        @Override
        public void smile() {
            System.out.println("Sad Smile");
        }

        @Override
        public void cry() {
            System.out.println("Happy cry");
        }
    };

    //需要实现的方法
    public abstract void smile();

    public abstract void cry();
}

使用 枚举类型enum 构建一个职责链:

利用enum可以为枚举实例添加方法的特性,可以构造简单的责任链 。 人在高兴,悲伤状态下的笑和哭具有不同的意义.

package enumeration;

public class StringHandler {
    enum handler {
        Sensitive {
            @Override
            String hand(String msg) {
                return msg.replace("敏感", "*");
            }
        },
        HTML {
            @Override
            String hand(String msg) {
                return msg.replace("<", "[").replace(">", "]");
            }
        };
        //枚举实例须实现此方法
        abstract String hand(String msg);
    }

    //遍历枚举实例处理字符串
    public static String hand(String msg) {
        for (handler h : handler.values()) {
            msg = h.hand(msg);
        }
        return msg;
    }

    public static void main(String[] args) {
        String msg = "敏感字符,<html>";
        System.out.println(StringHandler.hand(msg));
    }
}

enum 的多路并发:

也就是使用 switch。

查看enum 字节码:

类:

public enum EnumTest{
     START,CLOSE,PAUSE
}

编译出来的类似字节码Oolong语言:

.source EnumTest.java
.class public final super EnumTest
.super java/lang/Enum

.field public static final START LEnumTest;
.field public static final CLOSE LEnumTest;
.field public static final PAUSE LEnumTest;
.field private static final $VALUES [LEnumTest;

.method public static values ()[LEnumTest;
.limit stack 1
.limit locals 0
.line 1
l0:    getstatic EnumTest/$VALUES [LEnumTest;
l3:    invokevirtual [LEnumTest;/clone ()Ljava/lang/Object;
l6:    checkcast [LEnumTest;
l9:    areturn

.end method

.method public static valueOf (Ljava/lang/String;)LEnumTest;
.limit stack 2
.limit locals 1
.line 1
l0:    ldc_w
l3:    aload_0
l4:    invokestatic java/lang/Enum/valueOf (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
l7:    checkcast EnumTest
l10:    areturn

.end method

.method private <init> (Ljava/lang/String;I)V
.limit stack 3
.limit locals 3
.line 1
l0:    aload_0
l1:    aload_1
l2:    iload_2
l3:    invokespecial java/lang/Enum/<init> (Ljava/lang/String;I)V
l6:    return

.end method

.method static <clinit> ()V
.limit stack 4
.limit locals 0
.line 2
l0:    new EnumTest
l3:    dup
l4:    ldc "START"
l6:    iconst_0
l7:    invokespecial EnumTest/<init> (Ljava/lang/String;I)V
l10:    putstatic EnumTest/START LEnumTest;
l13:    new EnumTest
l16:    dup
l17:    ldc "CLOSE"
l19:    iconst_1
l20:    invokespecial EnumTest/<init> (Ljava/lang/String;I)V
l23:    putstatic EnumTest/CLOSE LEnumTest;
l26:    new EnumTest
l29:    dup
l30:    ldc "PAUSE"
l32:    iconst_2
l33:    invokespecial EnumTest/<init> (Ljava/lang/String;I)V
l36:    putstatic EnumTest/PAUSE LEnumTest;
.line 1
l39:    iconst_3
l40:    anewarray EnumTest
l43:    dup
l44:    iconst_0
l45:    getstatic EnumTest/START LEnumTest;
l48:    aastore
l49:    dup
l50:    iconst_1
l51:    getstatic EnumTest/CLOSE LEnumTest;
l54:    aastore
l55:    dup
l56:    iconst_2
l57:    getstatic EnumTest/PAUSE LEnumTest;
l60:    aastore
l61:    putstatic EnumTest/$VALUES [LEnumTest;
l64:    return
.end method

从类似字节码可以看出,enum被编译为了 常量类,而且父类是Enum,所以enum定义的类不能在继承其它父类,也不能被其它类集成。 枚举类型的field都是 public static final 静态常量类型; 初始化属性时 会现调用私有的父类(enum)构造器,然后初始化自己的所有field。 构造器只是在构造枚举值的时候被调用。

Search

    Post Directory