JAva列挙常用シーンのまとめ

16656 ワード

一、前言javaプログラミングの過程で、jdk 1で一定数の定数を定義する必要がある.5以前は、jdk 1から静的定数クラスを定義するのが一般的だった.5後、javaは列挙(キーワードenum、全称enumeration、値タイプ)を導入し、列挙では関連する定数を1つの列挙タイプにグループ化することができ、列挙も定数クラスよりも柔軟な使い方があり、列挙を用いることで、コードの清潔性、可読性、メンテナンス性などを効果的に向上させることができ、ここではよく使われる列挙の使い方を簡単にまとめることができる.
二、常用シーン1、曜日、季節、色、都市など、普通の定数として使用する.通常はswitch文と組み合わせて使用されます.例1:定義
//       
public enum WeekEnum {
    MON,TUES,WED,THURS,FRI,SAT,SUN;
}

使用
//jdk1.7  switch      String  , jdk1.6     int,char,enum  ,      ,            
public class TestEnum {
    public static void main(String[] args) {
        WeekEnum week = WeekEnum.TUES;
        switch (week) {
            case MON:
                System.out.println("   ");
                break;
            case TUES:
                System.out.println("   ");
                break;
            case WED:
                System.out.println("   ");
                break;
            case THURS:
                System.out.println("   ");
                break;
            case FRI:
                System.out.println("   ");
                break;
            case SAT:
                System.out.println("   ");
                break;
            case SUN:
                System.out.println("   ");
                break;
        }
    }
}

2、列挙に変数を追加したり、関数を構築したりして、指定した値を柔軟に取得する目的(注:Javaではenumインスタンスを定義する必要があります.そうしないとコンパイルが間違っています).通常、dbのフィールド値を一致させるなど、いくつかのビジネスシステムで固定値を定義するために使用されます.例2:定義
 //           ,    get       
 public enum CompanyEnum {
    SF("    ", 1001), YTO("    ", 1002),STO("    ",1003),YD("    ",1004),YZPY("    ",1005);
    private CompanyEnum(String company, int code) {
        this.company = company;
        this.code = code;
    }
    private String company; //     
    private int code; //     
    public String getCompany() {
        return company;
    }
    public void setCompany(String company) {
        this.company = company;
    }
    public int getCode() {
        return code;
    }
    public void setCode(int code) {
        this.code = code;
    }
}

使用
//  ->1001 、     
public class TestEnum {
    public static void main(String[] args) {
        System.out.println(CompanyEnum.SF.getCode());
        System.out.println(CompanyEnum.SF.getCompany());
    }
}

例3:定義
//    [0:  1:  2:  ]
public enum GenderEnum {
    MAN(0),WOMEN(1),UNKNOWN(2);
    private int code; //    
    private GenderEnum(int code){
        this.code = code;
    }
    public int getCode() {
        return code;
    }
}

使用
//  ->0 、 1 、 2
public class TestEnum {
    public static void main(String[] args) {
        System.out.println(GenderEnum.MAN.getCode());
        System.out.println(GenderEnum.WOMEN.getCode());
        System.out.println(GenderEnum.UNKNOWN.getCode());
    }
}

3、列挙に自分の特定の方法を追加して、自分の必要な関連業務ロジックを実現する.例4:定義
 public enum CompanyEnum {
    SF("    ", 1001), YTO("    ", 1002), STO("    ", 1003), YD("    ", 1004), YZPY("    ", 1005);
    private CompanyEnum(String company, int code) {
        this.company = company;
        this.code = code;
    }
    private String company; //     
    private int code; //     
    public String getCompany() {
        return company;
    }
    public void setCompany(String company) {
        this.company = company;
    }
    public int getCode() {
        return code;
    }
    public void setCode(int code) {
        this.code = code;
    }
    //               
    public static int getCodeByCompany(String company) {
        for (CompanyEnum c : CompanyEnum.values()) {
            if (c.getCompany().equals(company.trim())) {
                return c.code;
            }
        }
        return 0;
    }
    //               
    public static String getCompanyByCode(int code) {
        for (CompanyEnum c : CompanyEnum.values()) {
            if (c.getCode() == code) {
                return c.getCompany();
            }
        }
        return null;
    }
}

使用
//  ->1001 、      
public class TestEnum {
    public static void main(String[] args) {
        System.out.println(CompanyEnum.getCodeByCompany("    "));
        System.out.println(CompanyEnum.getCompanyByCode(1002));
    }
}

このような列挙用法は、通常、システムのエラーコードと対応するエラーコードの記述に用いられ、その後、エラーコードに基づいてエラーコードに対応する記述を取得する.三、その他javaの列挙には、toString()やequals()などの書き換え方法、インタフェースの実現、Mapの列挙など、他にも多くの使い方がありますが、実用的なものはそれほど多くないと思いますので、ここでは詳しくは述べませんが、2つの簡単な例を直接あげましょう.例5:
/**
*            
*/
public class TestEnum {
    public static void main(String[] args) {
        //          ,   java.lang.Enum ,              。  ->SF
        System.out.println(CompanyEnum.SF.toString());
        //          。  ->SF
        System.out.println(CompanyEnum.SF.name());
        //         (          ,          )。  ->0
        System.out.println(CompanyEnum.SF.ordinal());
        //          。  ->5
        System.out.println(CompanyEnum.SF.values().length);
        //                   。  ->    
        System.out.println(CompanyEnum.SF.valueOf(CompanyEnum.class, "SF").getCompany());  
        //             ;SF   0,YTO   1,    0-1=-1。  ->-1
        System.out.println(CompanyEnum.SF.compareTo(CompanyEnum.YTO)); 
        //                  Class   。  ->class com.cndmss.util.CompanyEnum
        System.out.println(CompanyEnum.SF.getDeclaringClass());
        //。  ->true
        System.out.println(CompanyEnum.SF.name().equals("SF"));
        //。  ->true
        System.out.println(CompanyEnum.SF.equals(CompanyEnum.SF));
        //。  ->false
        System.out.println(CompanyEnum.SF.equals(CompanyEnum.YTO));
    }
}

例6:
/**
 *EnumSet、EnumMap   
 */
public class TestEnum {
    public static void main(String[] args) {
         //1、 EnumSet   
        EnumSet companySet = EnumSet.allOf(CompanyEnum.class);
        for (CompanyEnum company:companySet) {
            System.out.println(company.getCode() + ":" + company.getCompany());
        }
        //2、EnumMap   
        EnumMap companyMap = new EnumMap(CompanyEnum.class);
        companyMap.put(CompanyEnum.SF, "  map");
        companyMap.put(CompanyEnum.YTO, "  map");
        Iterator> iter = companyMap.entrySet().iterator();
        while(iter.hasNext()){
            Entry entry = iter.next();
            System.out.println(entry.getKey().name() + ":" + entry.getValue());
        }
    }
}

四、総括1、すべての列挙クラスはjavaを継承する.lang.Enumクラスは、enumを一般的なclassと見なすことができ、いくつかの属性と方法を定義することができますが、javaは単一継承なので、列挙は他のクラスを継承することはできませんが、列挙はインタフェースを実現することができます.2、列挙を用いなくても他の方法で同様の効果を実現する代わりに、列挙を柔軟に運用することは多くの便利さをもたらすが、列挙のために列挙を用いることは禁物であり、かえって不利な影響を及ぼす可能性がある.
参考記事:
1、http://www.cnblogs.com/linjiqin/archive/2011/02/11/1951632.html 2、http://www.cnblogs.com/hemingwang0902/archive/2011/12/29/2306263.html 3、http://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.html