尚シリコンバレーjava学習ノート——9.JAva列挙&注釈

10413 ワード

一、列挙類
JDK1.5前にカスタム列挙クラスが必要です
列挙クラスオブジェクトのプロパティは変更を許可するべきではありません.private final修飾を使用する必要があります.列挙にメンバーが1人しかいない場合は、単一のモードの実装として使用できます.
public class TestSeason {
    public static void main(String args[]){
        Season spring=Season.SPRING;
        System.out.println(spring);
        spring.show();
        System.out.println(spring.getSeasonName());
    }
}

//   
class Season{
    //1.      ,   private final
    private final String seasonName;
    private final String seasonDesc;
    //2.   final   ,        
    private Season(String seasonName,String seasonDesc){
        this.seasonName=seasonName;
        this.seasonDesc=seasonDesc;
    }
    //3.            
    public String getSeasonName(){
        return seasonName;
    }
    public String getSeasonDesc(){
        return seasonDesc;
    }
    //4.       :        public static final 
    public static final Season SPRING = new Season("spring","    ");
    public static final Season SUMMER = new Season("summer","    ");
    public static final Season AUTUMN = new Season("autumn","    ");
    public static final Season WINTER = new Season("winter","    ");
    @Override
    public String toString() {
        return "Season [seasonName=" + seasonName + ", seasonDesc=" + seasonDesc + "]";
    }
    public void show(){
        System.out.println("      ");
    }
}

JDK 1.5新規enumキーワード列挙クラスの定義
列挙クラスの最初の行に列挙クラスオブジェクトを宣言する必要があります.enumで定義された列挙クラスはjavaをデフォルトで継承する.lang.Enumクラスにリストされているインスタンスシステムはpublic static final修飾を自動的に追加します
列挙クラスの主なメソッド:values()メソッド:列挙タイプのオブジェクト配列を返します.この方法は、すべての列挙値を容易に巡回することができる.valueOf(String str):文字列を対応する列挙クラスオブジェクトに変換できます.文字列は、クラスオブジェクトの「名前」を列挙する必要があります.そうでない場合は、運転時に異常が発生します.
各列挙値が実装を呼び出すインタフェースメソッドで異なる動作を示す必要がある場合、各列挙値にそれぞれその方法を実装させることができる.
public class TestSeason1 {
    public static void main(String args[]){
        Season1 spring=Season1.SPRING;
        System.out.println(spring);
        spring.show();
        System.out.println(spring.getSeasonName());

        //1.values()
        Season1 seasons[]=Season1.values();
        for(int i=0;i//2.valueOf(String name)        name         。  , java.lang.IllegalArgumentException  
        String str="SPRING";
        Season1 sea=Season1.valueOf(str);
        System.out.println(sea);

        Thread.State states[]=Thread.State.values();
        for(int i=0;ivoid show();
}

//   
enum Season1 implements Info{
    SPRING("spring","    "){
        public void show(){
            System.out.println("     ?");
        }
    },
    SUMMER("summer","    "){
        public void show(){
            System.out.println("    ");
        }
    },
    AUTUMN("autumn","    "){
        public void show(){
            System.out.println("        ");
        }
    },
    WINTER("winter","    "){
        public void show(){
            System.out.println("       ");
        }
    };

    private final String seasonName;
    private final String seasonDesc;
    private Season1(String seasonName,String seasonDesc){
        this.seasonName=seasonName;
        this.seasonDesc=seasonDesc;
    }
    public String getSeasonName(){
        return seasonName;
    }
    public String getSeasonDesc(){
        return seasonDesc;
    }
    @Override
    public String toString() {
        return "Season [seasonName=" + seasonName + ", seasonDesc=" + seasonDesc + "]";
    }

//  public void show(){
//      System.out.println("      ");
//  }
}

二、注記Annotation
  • JDK 5.0から、Javaはメタデータ(MetaData)のサポート、すなわちAnnotation(注釈)
  • を追加した.
  • Annotationは、コンパイル、クラスロード、実行時に読み取る、対応する処理を実行できるコード内の特殊なタグである.Annotationを使用することにより、プログラマは、元の論理を変更することなく、ソースファイルに補足情報を埋め込むことができる.
  • Annotationは修飾子のように使用することができ、パケット、クラス、コンストラクタ、メソッド、メンバー変数、パラメータ、ローカル変数の宣言を修飾するために使用することができ、これらの情報はAnnotationの「name=value」対に保存する.
  • Annotationは、プログラム要素(クラス、メソッド、メンバー変数など)のメタデータ
  • を設定するために用いることができる.
    基本的なAnnotation
  • Annotationを使用する場合は、その前に@記号を追加し、そのAnnotationを修飾子として使用します.サポートを修飾するためのプログラム要素
  • の3つの基本的なAnnotation:@Override:メソッド@Deprecated:あるプログラム要素(クラス、メソッドなど)が古くなったことを示すために使用できる書き換え親メソッドを限定する@SuppressWarnings:コンパイラ警告を抑制する
  • カスタムAnnotation
  • 新しいAnnotationタイプを定義@interfaceキーワード
  • を使用
  • Annotationのメンバー変数は、Annotation定義において無パラメータメソッドとして宣言する.メソッド名と戻り値は、そのメンバーの名前とタイプを定義する.
  • は、Annotationのメンバー変数を定義するときに初期値を指定することができ、指定メンバー変数の初期値はdefaultキーワード
  • を使用することができる.
    public @interface MyAnnotation {
        String value() default "hello";
    }
  • メンバー定義のないAnnotationをタグと呼ぶ.メンバー変数を含むAnnotationをメタデータAnnotation
  • と呼ぶ.
    JDKの元Annotation
  • JDKのメタAnnotationは、他のAnnotation定義
  • を修飾するために使用される
  • JDKは、注釈に特化した注釈タイプを提供します.
  • @Retention:Annotation定義を修飾するためにのみ使用できます.Annotationがどのくらい保持できるかを指定します.@RententionにはRetentionPolicyタイプのメンバー変数が含まれています.@Rententionを使用する場合は、valueメンバー変数の値を指定する必要があります.
  • RetentionPolicy.SOURCE:コンパイラは、このポリシーの注釈
  • を直接破棄する
  • RetentionPolicy.CLASS:コンパイラはコメントをclassファイルに記録します.Javaプログラムを実行する場合、JVMは注記を保持しません.これはデフォルトの
  • です.
  • RetentionPolicy.RUNTIME:コンパイラはコメントをclassファイルに記録する.Javaプログラムを実行すると、JVMはコメントを保持します.プログラムは、この注釈
  • を反射により取得することができる.
  • @Target:Annotation定義を修飾するために使用され、修飾されたAnnotationがどのプログラム要素を修飾するために使用できるかを指定するために使用される.Targetはvalueというメンバー変数も含む.
  • @Documented:このメタAnnotationによって修飾されるAnnotationクラスがjavadocツールによってドキュメントに抽出されることを指定します.Documentedとして定義された注記は、Retention値をRUNTIMEに設定する必要があります.
  • @Inherited:修飾されたAnnotationは継承性を持つ.クラスに@Inheritedで修飾されたAnnotationが使用されている場合、そのサブクラスは自動的に注釈を持ちます.実際の応用では、少ない
  • が使用されている.