Java列挙(enum)の6種類のよく使われる方法の詳細

8970 ワード

JDK1.5       --  , java              ,            。
           ,enum        ,        public       ,
         private   ;enum     ;enum    values             ;

説明:MSG_TYPE_SYSTEMは列挙定数であり、MsgTypeEnumは列挙クラスであり、具体的な例は以下を参照する.列挙定数名を使用して、対応する列挙インスタンスオブジェクトを取得します.
MsgTypeEnum s = MsgTypeEnum.valueOf(MSG_TYPE_SYSTEM.name());

列挙クラスの列挙定数のビットシーケンスを取得します.
MSG_TYPE_SYSTEM.ordinal();

1.用法一:定数
JDK 1.5の前に定数を定義しました.
public static final int a = 4; 上記のモードはint列挙モードと呼ばれ、int列挙モードはコンパイル時定数であるため、定数に関連する値が変化すると、再コンパイルしなければ機能しないため、脆弱である.
これで、関連する定数を列挙タイプにグループ化でき、列挙は定数よりも多くの方法を提供します.
public enum Color {  
  RED, GREEN, BLANK, YELLOW  
}

2.列挙に新しいメソッドを追加
独自のメソッドをカスタマイズする場合は、enumインスタンスシーケンスの最後にセミコロン(";")を追加する必要があります.javaでは、javaインスタンスを定義する必要があります.
package ggmsg.common;

public enum ChannelEnum {

    MSG_CENTER_CHANNEL1("msg_center_channel1"),
    MSG_CENTER_CHANNEL("msg_center_channel");

    private String channel = null;

    private ChannelEnum(String channel) {
        this.channel = channel;
    }

    public String getChannel() {
        return this.channel;
    }
}

3.実装インタフェース
すべての列挙はjava.lang.Enumクラスから継承されます.Javaはマルチ継承をサポートしていないため、列挙オブジェクトは他のクラスを継承できません.
public interface Behaviour {  
    void print();  
    String getInfo();  
}  
public enum Color implements Behaviour{  
    RED("  ", 1), GREEN("  ", 2), BLANK("  ", 3), YELLO("  ", 4);  
    //       
    private String name;  
    private int index;  
    //       
    private Color(String name, int index) {  
        this.name = name;  
        this.index = index;  
    }  
//      
    @Override  
    public String getInfo() {  
        return this.name;  
    }  
    //      
    @Override  
    public void print() {  
        System.out.println(this.index+":"+this.name);  
    }  
}

4.インタフェースを使用して列挙を整理する
package common.lang;

public interface Food {
    enum Coffee implements Food{  
        BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO  
    }  
    enum Dessert implements Food{  
        FRUIT, CAKE, GELATO  
    }  
}

5.switchでの列挙の使用
JDK 1.6の前にswitchはint、charのみをサポートし、その後enumタイプをサポートし、コードの可読性を向上させることができます.まず、クラスにfromMsgTypeメソッドを追加し、列挙値によって列挙値に対応する列挙インスタンスオブジェクトを取得する列挙MsgTypeクラスを定義します.
package ggmsg.common;

public enum MsgTypeEnum {
    //    
    MSG_TYPE_SYSTEM(10001),
    //    
    MSG_TYPE_LIVE_SYSTEM(10002),

    private int msgType;

    private MsgTypeEnum(int msgType){
        this.msgType = msgType;
    }

    public int getMsgType() {
        return this.msgType;
    }
    /**
     * 
     *             ,         。 
     *
     */
    public static MsgTypeEnum fromMsgType(int msgType) {  
        for (MsgTypeEnum type : MsgTypeEnum.values()) {  
            if (type.getMsgType() == msgType) {  
                return type;  
            }  
        }  
        return null;  
    } 
}

メソッドでswitch文を定義し、fromMsgTypeメソッドで対応する列挙インスタンスオブジェクトを取得し、caseの後に列挙タイプの名前を直接書きます.これにより、switch文で列挙を使用できます.
public static void handleMsg(Msg msg) {
        try {
            GGLogger.info(GGMsgService.class, "
WebSocket :

"
+msg.toString()); // MsgTypeEnum msgType = MsgTypeEnum.fromMsgType(msg.getMsg_type()); switch (msgType) { // case MSG_TYPE_ORDER: GGUserSubBuilder.addSubMsg(msg); break; // 【 】 case MSG_TYPE_SYSTEM: break; default: break; } } catch (Exception e) { GGUserSubBuilder.sendMsg(msg.getWebSocket(), "WebSocket !"+e); GGLogger.error(GGMsgService.class, "WebSocket !"+e); } }

上記の例から,enumの構造関数はprivateであり,外部クラスがnewの方法でenumのインスタンスを取得することは許されないことが分かる.
6.抽象メソッドを定義することによって列挙を定義する
public enum ProductEnum {

    //   
    TERMINAL{
        public int obtainSource() {
            return 4;
        }
    },
    //   
    ZHITOU{
        public int obtainSource() {
            return 28;
        }
    },
    //   
    TOUGU{
        public int obtainSource() {
            return 901;
        }
    };

    public abstract int obtainSource();
}