Java アノテーション タイプ
Java アノテーション タイプ
このチュートリアルでは、例を使ってさまざまな種類の Java アノテーションについて学習します。
Java アノテーションは、プログラム ソース コードのメタデータ (データに関するデータ) です。 Java SE によって提供される定義済みの注釈がいくつかあります。さらに、必要に応じてカスタム アノテーションを作成することもできます。
注釈とは何かがわからない場合は、Java 注釈のチュートリアルにアクセスしてください。
これらの注釈は次のように分類できます:
1. 定義済みの注釈
@Deprecated
@Override
@SuppressWarnings
@SafeVarargs
@FunctionalInterface
2. カスタム アノテーション
3. メタアノテーション
@Retention
@Documented
@Target
@Inherited
@Repeatable
定義済みの注釈タイプ
1. @非推奨
@Deprecated
アノテーションは、要素 (クラス、メソッド、フィールドなど) が廃止され、新しい要素に置き換えられたことを示すマーカー アノテーションです。
その構文は次のとおりです:
@Deprecated
accessModifier returnType deprecatedMethodName() { ... }
非推奨と宣言された要素をプログラムが使用すると、コンパイラは警告を生成します。
Javadoc @deprecated
を使用します 非推奨の要素を文書化するためのタグ。
/**
* @deprecated
* why it was deprecated
*/
@Deprecated
accessModifier returnType deprecatedMethodName() { ... }
例 1:@Deprecated アノテーションの例
class Main {
/**
* @deprecated
* This method is deprecated and has been replaced by newMethod()
*/
@Deprecated
public static void deprecatedMethod() {
System.out.println("Deprecated method");
}
public static void main(String args[]) {
deprecatedMethod();
}
}
出力
Deprecated method
2. @オーバーライド
@Override
注釈は、サブクラスのメソッドがスーパークラスのメソッドを同じメソッド名、戻り値の型、およびパラメーター リストでオーバーライドすることを指定します。
@Override
の使用は必須ではありません メソッドをオーバーライドするとき。ただし、これを使用すると、メソッドのオーバーライド中に何か問題がある場合 (パラメーターの型が間違っているなど)、コンパイラーはエラーを返します。
例 2:@Override アノテーションの例
class Animal {
// overridden method
public void display(){
System.out.println("I am an animal");
}
}
class Dog extends Animal {
// overriding method
@Override
public void display(){
System.out.println("I am a dog");
}
public void printMessage(){
display();
}
}
class Main {
public static void main(String[] args) {
Dog dog1 = new Dog();
dog1.printMessage();
}
}
出力
I am a dog
この例では、オブジェクト dog1 を作成することにより、 犬の クラス、そのメソッド printMessage() を呼び出すことができます 次に display()
を実行します
display()
以降 サブクラス Dog のメソッドは両方のクラスで定義されています スーパークラス Animal のメソッドをオーバーライドします .したがって、display()
のサブクラスが呼び出されます。
3. @SuppressWarnings
名前が示すように、@SuppressWarnings
注釈は、プログラムの実行中に生成される警告を抑制するようにコンパイラに指示します。
抑制する警告の種類を指定できます。抑制できる警告はコンパイラ固有ですが、警告には次の 2 つのカテゴリがあります。非推奨 オフ .
特定のカテゴリの警告を抑制するには、次を使用します:
@SuppressWarnings("warningCategory")
たとえば、
@SuppressWarnings("deprecated")
複数のカテゴリの警告を抑制するには、以下を使用します:
@SuppressWarnings({"warningCategory1", "warningCategory2"})
たとえば、
@SuppressWarnings({"deprecated", "unchecked"})
カテゴリ deprecated
非推奨の要素を使用するときに警告を抑制するようにコンパイラに指示します。
カテゴリ unchecked
生の型を使用するときに警告を抑制するようにコンパイラに指示します。
また、未定義の警告は無視されます。たとえば、
@SuppressWarnings("someundefinedwarning")
例 3:@SuppressWarnings アノテーションの例
class Main {
@Deprecated
public static void deprecatedMethod() {
System.out.println("Deprecated method");
}
@SuppressWarnings("deprecated")
public static void main(String args[]) {
Main depObj = new Main();
depObj. deprecatedMethod();
}
}
出力
Deprecated method
ここでは、deprecatedMethod()
非推奨としてマークされており、使用するとコンパイラの警告が表示されます。 @SuppressWarnings("deprecated")
を使用して 注釈を付けることで、コンパイラの警告を回避できます。
4. @SafeVarargs
@SafeVarargs
注釈は、注釈付きのメソッドまたはコンストラクターがその varargs (可変数の引数) に対して安全でない操作を実行しないことを表明します。
このアノテーションは、オーバーライドできないメソッドまたはコンストラクターでのみ使用できます。これは、メソッドをオーバーライドするメソッドが安全でない操作を実行する可能性があるためです。
Java 9 より前は、オーバーライドできないため、このアノテーションは最終メソッドまたは静的メソッドでのみ使用できました。この注釈をプライベート メソッドにも使用できるようになりました。
例 4:@SafeVarargs アノテーションの例
import java.util.*;
class Main {
private void displayList(List<String>... lists) {
for (List<String> list : lists) {
System.out.println(list);
}
}
public static void main(String args[]) {
Main obj = new Main();
List<String> universityList = Arrays.asList("Tribhuvan University", "Kathmandu University");
obj.displayList(universityList);
List<String> programmingLanguages = Arrays.asList("Java", "C");
obj.displayList(universityList, programmingLanguages);
}
}
警告
Type safety: Potential heap pollution via varargs parameter lists Type safety: A generic array of List<String> is created for a varargs parameter
出力
Note: Main.java uses unchecked or unsafe operations. [Tribhuvan University, Kathmandu University] [Tribhuvan University, Kathmandu University] [Java, C]
ここでは、List
... lists
List
型の可変長引数を指定します .これは、メソッド displayList()
が 0 個以上の引数を持つことができます。
上記のプログラムはエラーなしでコンパイルされますが、 @SafeVarargs
の場合に警告が表示されます 注釈は使用されません。
@SafeVarargs
を使用する場合 上記の例の注釈
@SafeVarargs private void displayList(List<String>... lists) { ... }
同じ出力が得られますが、警告はありません。この注釈を使用すると、チェックされていない警告も抑制されます。
5. @FunctionalInterface
Java 8 で初めてこの @FunctionalInterface
が導入されました 注釈。この注釈は、それが使用されている型宣言が関数型インターフェイスであることを示します。関数型インターフェースは、抽象メソッドを 1 つだけ持つことができます。
例 5:@FunctionalInterface アノテーションの例
@FunctionalInterface
public interface MyFuncInterface{
public void firstMethod(); // this is an abstract method
}
別の抽象メソッドを追加すると、たとえば
@FunctionalInterface
public interface MyFuncInterface{
public void firstMethod(); // this is an abstract method
public void secondMethod(); // this throws compile error
}
ここで、プログラムを実行すると、次の警告が表示されます:
Unexpected @FunctionalInterface annotation @FunctionalInterface ^ MyFuncInterface is not a functional interface multiple non-overriding abstract methods found in interface MyFuncInterface
@FunctionalInterface
の使用は必須ではありません 注釈。コンパイラは、機能インターフェースの定義を満たすすべてのインターフェースを機能インターフェースと見なします。
この注釈を使用して、機能インターフェースに抽象メソッドが 1 つしかないことを確認します。
ただし、実装があるため、既定のメソッドと静的メソッドをいくつでも持つことができます。
@FunctionalInterface
public interface MyFuncInterface{
public void firstMethod(); // this is an abstract method
default void secondMethod() { ... }
default void thirdMethod() { ... }
}
カスタム注釈
独自のカスタム アノテーションを作成することもできます。
その構文は次のとおりです:
[Access Specifier] @interface<AnnotationName> { DataType <Method Name>() [default value]; }
カスタム アノテーションについて知っておくべきことは次のとおりです。
- 注釈は
@interface
を使用して作成できます 注釈名が続きます。 - アノテーションには、メソッドのように見える要素を含めることができますが、実装はありません。
- デフォルト値はオプションです。パラメータに null 値を含めることはできません。
- メソッドの戻り値の型は、プリミティブ、列挙型、文字列、クラス名、またはこれらの型の配列です。
例 6:カスタム アノテーションの例
@interface MyCustomAnnotation {
String value() default "default value";
}
class Main {
@MyCustomAnnotation(value = "programiz")
public void method1() {
System.out.println("Test method 1");
}
public static void main(String[] args) throws Exception {
Main obj = new Main();
obj.method1();
}
}
出力
Test method 1
メタ アノテーション
メタ注釈は、他の注釈に適用される注釈です。
1. @リテンション
@Retention
注釈は、注釈が利用可能になるレベルを指定します。
その構文は次のとおりです:
@Retention(RetentionPolicy)
3 種類の保持ポリシーがあります:
- RetentionPolicy.SOURCE - 注釈はソース レベルでのみ使用でき、コンパイラによって無視されます。
- RetentionPolicy.CLASS - 注釈はコンパイル時にコンパイラで使用できますが、Java 仮想マシン (JVM) では無視されます。
- RetentionPolicy.RUNTIME - 注釈は JVM で使用できます。
たとえば、
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation{ ... }
2. @文書化
デフォルトでは、カスタム アノテーションは公式の Java ドキュメントには含まれていません。 Javadoc ドキュメントに注釈を含めるには、@Documented
を使用します。 注釈。
たとえば、
@Documented
public @interface MyCustomAnnotation{ ... }
3. @ターゲット
@Target
を使用して、特定のターゲットに適用されるアノテーションを制限できます 注釈。
その構文は次のとおりです:
@Target(ElementType)
ElementType
次のいずれかの型を持つことができます:
要素タイプ | ターゲット |
---|---|
ElementType.ANNOTATION_TYPE | 注釈タイプ |
ElementType.CONSTRUCTOR | コンストラクタ |
ElementType.FIELD | フィールド |
ElementType.LOCAL_VARIABLE | ローカル変数 |
ElementType.METHOD | 方法 |
ElementType.PACKAGE | パッケージ |
ElementType.PARAMETER | パラメータ |
ElementType.TYPE | クラスの任意の要素 |
たとえば、
@Target(ElementType.METHOD)
public @interface MyCustomAnnotation{ ... }
この例では、このアノテーションの使用をメソッドのみに制限しています。
注: ターゲット タイプが定義されていない場合、注釈は任意の要素に使用できます。
4. @継承
デフォルトでは、注釈型はスーパークラスから継承できません。ただし、スーパークラスからサブクラスにアノテーションを継承する必要がある場合は、@Inherited
を使用します 注釈。
その構文は次のとおりです:
@Inherited
たとえば、
@Inherited
public @interface MyCustomAnnotation { ... }
@MyCustomAnnotation
public class ParentClass{ ... }
public class ChildClass extends ParentClass { ... }
5. @繰り返し可能
@Repeatable
でマークされた注釈 同じ宣言に複数回適用できます。
@Repeatable(Universities.class)
public @interface University {
String name();
}
@Repeatable
で定義された値 注釈はコンテナ注釈です。コンテナ アノテーションには変数 value があります 上記の繰り返し可能なアノテーションの配列型の。ここでは、Universities
含まれている注釈型です。
public @interface Universities {
University[] value();
}
さて、@University
注釈は、同じ宣言で複数回使用できます。
@University(name = "TU")
@University(name = "KU")
private String uniName;
注釈データを取得する必要がある場合は、Reflection API を使用できます。
注釈値を取得するには、getAnnotationsByType()
を使用します または getAnnotations()
Reflection API で定義されたメソッド
Java