LoginSignup
2
2

More than 1 year has passed since last update.

Java SE11 Gold 対策メモ --アノテーション編

Last updated at Posted at 2021-06-29

概要

  • Java SE11 Gold 試験用にまとめていた自分用メモ
  • こちらの記事を参考にSE8⇒SE11の変更点等をまとめていきます。

アノテーションの仕様

アノテーションは各要素に対して注釈を付ける機能です
java.lang.annotation.Annotation パッケージで宣言

主なアノテーション 説明
@￰Override スーパークラスのメソッドをオーバーライドすることを示す
@￰FunctionalInterface 関数型インターフェースであることを示す
@￰Deprecated 非推奨の要素であることを示す
@￰SuppressWarnings コンパイラの警告を無効にする
@￰SafeVarargs 安全でない可変長引数に対する警告を無視する

@￰Override

スーパークラスのメソッドをオーバーライドすることを示す

@Override
class Super{
    void test1(){}
    void test2(){}
}

public class Main extends Super{

    @Override
    void test1(){}
    //@Override
    //void hoge(){} //コンパイルエラー

}

@￰FunctionalInterface

  • 関数型インターフェースであることを示す
@FunctionalInterface
@FunctionalInterface
interface A<T>{
    int num = 0;

    T Test_1();
    //void Test_2();    //2つ目以降の抽象メソッドはエラー
    static  void Test_3() {}
    default void Test_4() {}
    private void Test_5() {}

    @Override 
    boolean equals(Object obj);    //Objectクラスのpublicメソッドは抽象メソッドとして可

    @Override
    String toString();
}
失敗例
@FunctionalInterface     //関数型インターフェースとしての要件を満たしていないためエラー
interface B<T>{
    boolean equals(Object obj);
}

@￰Deprecated

  • 非推奨の要素であることを示す
    ※IDE次第では、宣言元、呼び出し先にてSuperとなる(Eclipseにて確認済み)
@Deprecated
class Super{

    @Deprecated
    Super(){}
    Super(int num){}
}

public class Main {

    public static void main(String[] args) {
        Super super1 = new Super();    //非推奨となり警告が出る
        Super super2 = new Super(10);    //こちらはならない
    }
}

@￰SuppressWarnings

  • コンパイラの警告を無効にする
  • "unchecked"は型の仕様に関連する(List<>を指定せずに宣言)
    警告を抑制する
  • "deprecation"は@￰Deprecatedがつけられた要素を
    使用した際の警告を抑制する
@SuppressWarnings
/*
 * 1.@SuppressWarnings(value = {"deprecation"})
 * 2.@SuppressWarnings(value = {"deprecation", unchecked})
 * 3.@SuppressWarnings("deprecation")
 * 4.@SuppressWarnings({"deprecation"})
 * 5.@SuppressWarnings({"deprecation", unchecked})
 */

@SuppressWarnings(value = {"deprecation"})
public class Main {

    public static void main(String[] args) {
        Date date = new Date("2021/06/28");
        System.out.println(date);
    }
}

@￰SafeVarargs

  • 安全でない可変長引数に対する警告を無視する
@SafeVarargs
public class Main {
    /*
     * @SafeVarargsをつける場合
     * final, static, privateのいずれか
     * でなければならない
     */
    @SafeVarargs
    static void test(String... str) {
        System.out.println(str[0]);
    }
    public static void main(String[] args) {
        String str = "Hello";
        test(str);
    }
}

カスタムアノテーション

  • 独自のアノテーションを実装することができる
  • 型は@￰interfaceを使用します
  • java.lang.annotation.Annotationインターフェースを継承している
  • 注釈としての機能を目的とする
実装例
public @interface MyAnnot {
    public enum RANK {A, B, C, D};

    //void test_1();    //コンパイルエラー
    /*  
    *引数は、基本データ型、String型、
    *Class型、列挙型、アノテーション型、
    *上記の1次元配列のみ許可
    */

    int test_2();
    //RANK test_3() default null;    //コンパイルエラー defalutにnullは指定できない
    RANK test_4() default RANK.B;
    String value();
}
使用例
public class Main {
    @MyAnnot(test_2 = 0, value = "")    //defaltで宣言されたtest_3は省略可能
    public void method() {
    }
}

メタアノテーション

  • 主にカスタムアノテーションに注釈を付ける為に用いる
  • アノテーションの特性や使い方を制御することができる
主なアノテーション 説明
@￰Documented Javadoc API ドキュメントの出力にも反映するようにする
@￰Target アノテーションを付与する要素を限定する
@￰Retention アノテーションをソースコードもしくはクラスファイルまで保持するかなどを制御する
@￰Inherited サブクラスにアノテーションを引き継ぐことを示す
@￰Repeatable 同じ場所に複数回適用する

@￰Documented

  • Javadoc API ドキュメントの出力にも反映するようにする
@Documented    //APIドキュメントにMyAnnotアノテーションを付与した要素が反映される
public @interface MyAnnot {
    public enum RANK {A, B, C, D};
    RANK test();
}

@￰Target

  • 「このアノテーションはクラス宣言で使用する」といった適材箇所を限定する
  • ElementType列挙型で用意されている
  • 複数選択が可能
@Target(ElementType.METHOD)    //メソッドにのみ付与できる
public @interface MyAnnot {
    public enum RANK {A, B, C, D};
    RANK test();
}
//@Target_MyAnnot(test = RANK.A)    //メソッドのみの制限があるのでコンパイルエラー
public class Main{
    @Target_MyAnnot(test = RANK.A)    //メソッドに付与しているので正しい
    public void method(int a) {
    }
}

@￰Retention

  • ソースコード、クラスファイル、クラスファイル実行時において
    アノテーションの挙動を制御する
  • RetentionPolicy列挙型で用意されている
  • デフォルトは(RetentionPolicy.CLASS)

↓↓↓↓↓↓@￰SuppressWarningsを抜粋↓↓↓↓↓↓

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
     String[] value();
}

@￰Inherited

  • サブクラスにスーパークラスのアノテーションを引き継ぐことを示す
  • クラスアノテーションのみ適用される
@Inherited
public @interface MyAnnot {
    public enum RANK {A, B, C, D};
    RANK test();
}

@￰Repeatable

  • 複数回可能となるアノテーションの定義
  • 複数のデータを保持できる、コンテナアノテーションを用いる
失敗例
@MyAnnot("test1")
public class Main{
  //@MyAnnot("test2")    //コンパイルエラー
  //@MyAnnot("test3")    //コンパイルエラー
  public void method(int a) {
  }
}
成功例
public @interface MyAnnotContainer {    //コンテナアノテーション
  public MyAnnot[] value();             //複数のデータを格納できるように配列で宣言する
}

@Repeatable(MyAnnotContainer.class)    //引数にコンテナアノテーション
public @interface MyAnnot {
  public String value();
}

@MyAnnot("test1")
public class Main{
  @MyAnnot("test2")    //    コンパイル可能
  @MyAnnot("test3")    
  public void method(int a) {
  }
}

参考書

オラクル認定資格教科書 Javaプログラマ Gold SE11
徹底攻略Java SE 8 Gold問題集

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2