Enum「優雅で清潔」に問題を解決

3524 ワード

1.分析コード1とコード2のコード
コード1:
 
import java.util.EnumMap;
import java.util.EnumSet;
/**
 * enum , , ,switch,enumset,enummap 
 * @author 
 *
 */
public class EnumBasic {
  /* */
  public enum State{
    ON,
    OFF
  }
  public static void main(String[] args){
    // 
    for(State s:State.values()){
      System.out.println(s.name());
    }
    
    //swith  enum  
    System.out.println("enum  swith  ");
    State state  = State.OFF;
    switch(state){
      case OFF:
        System.out.println("It is OFF");
      break;
      case ON:
        System.out.println("It is ON");
      break;
    }
    
    //enumset 
   // EnumSet enumSet = EnumSet.allOf(State.class);
    System.out.println("enumset  ");
    for(State s : EnumSet.allOf(State.class)){
      System.out.print(s.name() +" ");
    }
    
    //EnumMap 
    System.out.println("EnumMap  ");
    EnumMap enumMap = new EnumMap(State.class);
    enumMap.put(State.ON, " is ON ");
    enumMap.put(State.OFF, " is OFF ");
    for(State s:State.values()){
      System.out.println(enumMap.get(s));
    }
  }
}

 
コード2:
/**
 *  
 * @author zuohuai
 *
 */
public enum TestEnumMethod {
  
  /**
   *  
   */
  SMAPLE1{
    public String getInfo(){
      return "SMAPLE1's return String";
    }
  },
  SMAPLE2{
    public String getInfo(){
      return "SMAPLE2's return String";
    }
  };
    //  
   public  abstract String getInfo();
   
   public static void main(String[] args){
    for(TestEnumMethod methods : TestEnumMethod.values()){
      System.out.println(methods.getInfo());
    }
   }
} 

  
2.討論と総括
 
public class State {
  public static final int ON = 1;
  public static final Int OFF= 0;
}

何か悪いことがあったら、みんなこのように長い間使っていたので、大丈夫ですね.まず、タイプが安全ではありません.intであることを確認しなければなりません.次に、その範囲が0と1であることを確認しなければなりません.最後に、多くの場合、印刷されると、1と0しか見えませんが、コードを見ていない人はあなたの企みを知らないことがあります.so、古いpublic static final定数をすべて捨てましょう.
3.他のクラスを継承できない以外は、通常のクラスとしてEnumクラスを作成できます(javaは単一の継承であり、Enumクラスを継承しています).クラスでメソッド、実装メソッド、リロードメソッドなどを宣言できます.
4)Switch文ではサポートはEnum
5)values()メソッドは、コンパイラがenum定義に挿入するstaticメソッドなので、enumインスタンスを親Enumに変換するとvalues()にアクセスできません.解決策:ClassにgetEnumConstants()メソッドがあるので、Enumインタフェースにvalues()メソッドがなくても、Classオブジェクトからすべてのenumインスタンスを取得できます.
6)enumからサブクラスを継承することはできません.enumの要素を拡張する必要がある場合は、インタフェースの内部にインタフェースを実装する列挙を作成し、要素をグループ化します.列挙要素をグループ化します.
7)エンムセットをフラグの代わりに使用する.Enumではメンバーが一意であることが要求されますが、enumでは追加要素を削除できません. 
8)EnumMapのkeyはenumであり、valueは他のObjectオブジェクトである.
9)enumは、プログラマがeunmインスタンスのメソッドを記述することを許可する.したがって、enumインスタンスごとに異なる動作を付与することができる.
10)enumの職責チェーン(Chain of Responsibility)を使用する.これは設計モードに関係する職責チェーンモードである.いろいろな方法で一つの問題を解決する.そして彼らをリンクします.1つのリクエストが来ると、チェーン内のソリューションがリクエストを処理できるまで、このチェーンを巡回します.
11)enumを使用したステータスマシン
12)enum多重配布の使用
回転:http://tech.e800.com.cn/articles/2009/97/1252286198897_1.html