概要
- 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) {
}
}