工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Java

Java アノテーション タイプ

Java アノテーション タイプ

このチュートリアルでは、例を使ってさまざまな種類の Java アノテーションについて学習します。

Java アノテーションは、プログラム ソース コードのメタデータ (データに関するデータ) です。 Java SE によって提供される定義済みの注釈がいくつかあります。さらに、必要に応じてカスタム アノテーションを作成することもできます。

注釈とは何かがわからない場合は、Java 注釈のチュートリアルにアクセスしてください。

これらの注釈は次のように分類できます:

1. 定義済みの注釈

2. カスタム アノテーション

3. メタアノテーション


定義済みの注釈タイプ

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];
}

カスタム アノテーションについて知っておくべきことは次のとおりです。

例 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 種類の保持ポリシーがあります:

たとえば、

@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

  1. Java データ型 (プリミティブ)
  2. Java オペレーター
  3. Java インターフェイス
  4. Java try-with-resources
  5. Java アノテーション
  6. Java アノテーション タイプ
  7. Java String charAt() メソッドと例
  8. 例を使用したJava文字列のendsWith()メソッド
  9. Java 文字列 replace()、replaceAll() および replaceFirst() メソッド
  10. Java - 変数の型
  11. Java - 修飾子の種類