Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Java

Java-Anmerkungstypen

Java-Anmerkungstypen

In diesem Tutorial lernen wir anhand von Beispielen verschiedene Arten von Java-Annotationen kennen.

Java-Annotationen sind Metadaten (Daten über Daten) für unseren Programmquellcode. Es gibt mehrere vordefinierte Anmerkungen, die von Java SE bereitgestellt werden. Darüber hinaus können wir auch benutzerdefinierte Anmerkungen nach unseren Bedürfnissen erstellen.

Wenn Sie nicht wissen, was Anmerkungen sind, besuchen Sie das Java-Annotations-Tutorial.

Diese Anmerkungen können wie folgt kategorisiert werden:

1. Vordefinierte Anmerkungen

2. Benutzerdefinierte Anmerkungen

3. Meta-Anmerkungen


Vordefinierte Anmerkungstypen

1. @Veraltet

Die @Deprecated annotation ist eine Markierungsannotation, die angibt, dass das Element (Klasse, Methode, Feld usw.) veraltet ist und durch ein neueres Element ersetzt wurde.

Seine Syntax ist:

@Deprecated
accessModifier returnType deprecatedMethodName() { ... }

Wenn ein Programm das als veraltet deklarierte Element verwendet, generiert der Compiler eine Warnung.

Wir verwenden Javadoc @deprecated -Tag zum Dokumentieren des veralteten Elements.

/**
 * @deprecated
 * why it was deprecated
 */
@Deprecated
accessModifier returnType deprecatedMethodName() { ... }

Beispiel 1:@Veraltetes Anmerkungsbeispiel

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();
  }
}

Ausgabe

Deprecated method

2. @Override

Die @Override Die Anmerkung gibt an, dass eine Methode einer Unterklasse die Methode der Oberklasse mit demselben Methodennamen, Rückgabetyp und derselben Parameterliste überschreibt.

Es ist nicht zwingend erforderlich, @Override zu verwenden beim Überschreiben einer Methode. Wenn wir es jedoch verwenden, gibt der Compiler einen Fehler aus, wenn etwas falsch ist (z. B. falscher Parametertyp), während er die Methode überschreibt.

Beispiel 2:Beispiel für eine @Override-Anmerkung

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();
  }
}

Ausgabe

I am a dog

In diesem Beispiel durch Erstellen eines Objekts dog1 von Hund Klasse, können wir ihre Methode printMessage() aufrufen der dann display() ausführt Aussage.

Seit display() In beiden Klassen ist die Methode der Unterklasse Dog definiert überschreibt die Methode der Oberklasse Animal . Daher der display() der Unterklasse aufgerufen wird.


3. @SuppressWarnings

Wie der Name schon sagt, der @SuppressWarnings Annotation weist den Compiler an, Warnungen zu unterdrücken, die während der Programmausführung generiert werden.

Wir können die Art der zu unterdrückenden Warnungen angeben. Die Warnungen, die unterdrückt werden können, sind Compiler-spezifisch, aber es gibt zwei Kategorien von Warnungen:veraltet und deaktiviert .

Um eine bestimmte Kategorie von Warnungen zu unterdrücken, verwenden wir:

@SuppressWarnings("warningCategory")

Zum Beispiel

@SuppressWarnings("deprecated")

Um mehrere Kategorien von Warnungen zu unterdrücken, verwenden wir:

@SuppressWarnings({"warningCategory1", "warningCategory2"})

Zum Beispiel

@SuppressWarnings({"deprecated", "unchecked"})

Kategorie deprecated weist den Compiler an, Warnungen zu unterdrücken, wenn wir ein veraltetes Element verwenden.

Kategorie unchecked weist den Compiler an, Warnungen zu unterdrücken, wenn wir Rohtypen verwenden.

Und undefinierte Warnungen werden ignoriert. Zum Beispiel

@SuppressWarnings("someundefinedwarning")

Beispiel 3:Beispiel für eine @SuppressWarnings-Anmerkung

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();
  }
}

Ausgabe

Deprecated method

Hier, deprecatedMethod() wurde als veraltet markiert und gibt bei Verwendung Compiler-Warnungen aus. Durch die Verwendung des @SuppressWarnings("deprecated") Annotation können wir Compiler-Warnungen vermeiden.


4. @SafeVarargs

Der @SafeVarargs Annotation bestätigt, dass die annotierte Methode oder der Konstruktor keine unsicheren Operationen an seinen Varargs (variable Anzahl von Argumenten) durchführt.

Wir können diese Annotation nur für Methoden oder Konstruktoren verwenden, die nicht überschrieben werden können. Dies liegt daran, dass die Methoden, die sie überschreiben, möglicherweise unsichere Vorgänge ausführen.

Vor Java 9 konnten wir diese Annotation nur für finale oder statische Methoden verwenden, da sie nicht überschrieben werden können. Wir können diese Anmerkung jetzt auch für private Methoden verwenden.

Beispiel 4:@SafeVarargs-Anmerkungsbeispiel

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

Warnungen

Type safety: Potential heap pollution via varargs parameter lists
Type safety: A generic array of List<String> is created for a varargs 
 parameter

Ausgabe

Note: Main.java uses unchecked or unsafe operations.
[Tribhuvan University, Kathmandu University]
[Tribhuvan University, Kathmandu University]
[Java, C]

Hier, List ... lists gibt ein Argument variabler Länge vom Typ List an . Das bedeutet, dass die Methode displayList() kann null oder mehr Argumente haben.

Das obige Programm wird ohne Fehler kompiliert, gibt aber Warnungen aus, wenn @SafeVarargs Anmerkung wird nicht verwendet.

Wenn wir @SafeVarargs verwenden Anmerkung im obigen Beispiel,

@SafeVarargs
 private void displayList(List<String>... lists) { ... }

Wir erhalten die gleiche Ausgabe, aber ohne Warnungen. Ungeprüfte Warnungen werden ebenfalls unterdrückt, wenn wir diese Anmerkung verwenden.


5. @FunctionalInterface

Java 8 hat diesen @FunctionalInterface erstmals eingeführt Anmerkung. Diese Anmerkung gibt an, dass die Typdeklaration, für die sie verwendet wird, eine funktionale Schnittstelle ist. Eine funktionale Schnittstelle kann nur eine abstrakte Methode haben.

Beispiel 5:@FunctionalInterface-Anmerkungsbeispiel

@FunctionalInterface
public interface MyFuncInterface{
  public void firstMethod(); // this is an abstract method
}

Nehmen wir an, wir fügen eine weitere abstrakte Methode hinzu

@FunctionalInterface
public interface MyFuncInterface{
  public void firstMethod(); // this is an abstract method
  public void secondMethod(); // this throws compile error
}

Wenn wir nun das Programm ausführen, erhalten wir die folgende Warnung:

Unexpected @FunctionalInterface annotation
@FunctionalInterface ^ MyFuncInterface is not a functional interface
multiple non-overriding abstract methods found in interface MyFuncInterface

Es ist nicht zwingend erforderlich, @FunctionalInterface zu verwenden Anmerkung. Der Compiler betrachtet jede Schnittstelle, die der funktionalen Schnittstellendefinition entspricht, als funktionale Schnittstelle.

Wir verwenden diese Anmerkung, um sicherzustellen, dass die funktionale Schnittstelle nur eine abstrakte Methode hat.

Es kann jedoch eine beliebige Anzahl von Standard- und statischen Methoden haben, da sie eine Implementierung haben.

@FunctionalInterface
public interface MyFuncInterface{
  public void firstMethod(); // this is an abstract method
  default void secondMethod() { ... } 
  default void thirdMethod() { ... } 
}

Benutzerdefinierte Anmerkungen

Es ist auch möglich, unsere eigenen benutzerdefinierten Anmerkungen zu erstellen.

Seine Syntax ist:

[Access Specifier] @interface<AnnotationName> {         
  DataType <Method Name>() [default value];
}

Folgendes müssen Sie über benutzerdefinierte Anmerkungen wissen:

Beispiel 6:Beispiel für benutzerdefinierte Anmerkungen

@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();
  }
}

Ausgabe

Test method 1

Meta-Anmerkungen

Meta-Anmerkungen sind Anmerkungen, die auf andere Anmerkungen angewendet werden.

1. @Aufbewahrung

Der @Retention Anmerkung gibt die Ebene an, bis zu der die Anmerkung verfügbar sein wird.

Seine Syntax ist:

@Retention(RetentionPolicy)

Es gibt drei Arten von Aufbewahrungsrichtlinien:

Zum Beispiel

@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation{ ... }

2. @Dokumentiert

Standardmäßig sind benutzerdefinierte Anmerkungen nicht in der offiziellen Java-Dokumentation enthalten. Um unsere Anmerkung in die Javadoc-Dokumentation aufzunehmen, verwenden wir den @Documented Anmerkung.

Zum Beispiel

@Documented
public @interface MyCustomAnnotation{ ... }

3. @Ziel

Mit dem @Target können wir eine Anmerkung einschränken, die auf bestimmte Ziele angewendet werden soll Anmerkung.

Seine Syntax ist:

@Target(ElementType)

Der ElementType kann einen der folgenden Typen haben:

Elementtyp Ziel
ElementType.ANNOTATION_TYPE Anmerkungstyp
ElementType.CONSTRUCTOR Konstruktoren
ElementType.FIELD Felder
ElementType.LOCAL_VARIABLE Lokale Variablen
ElementType.METHOD Methoden
ElementType.PACKAGE Paket
ElementType.PARAMETER Parameter
ElementType.TYPE Jedes Element der Klasse

Zum Beispiel

@Target(ElementType.METHOD)
public @interface MyCustomAnnotation{ ... }

In diesem Beispiel haben wir die Verwendung dieser Anmerkung nur auf Methoden beschränkt.

Hinweis: Wenn der Zieltyp nicht definiert ist, kann die Annotation für jedes Element verwendet werden.


4. @Geerbt

Standardmäßig kann ein Annotationstyp nicht von einer Oberklasse geerbt werden. Wenn wir jedoch eine Anmerkung von einer Oberklasse an eine Unterklasse erben müssen, verwenden wir den @Inherited Anmerkung.

Seine Syntax ist:

@Inherited

Zum Beispiel

@Inherited
public @interface MyCustomAnnotation { ... }

@MyCustomAnnotation
public class ParentClass{ ... }

public class ChildClass extends ParentClass { ... }

5. @Wiederholbar

Eine Anmerkung, die mit @Repeatable gekennzeichnet wurde kann mehrmals auf dieselbe Deklaration angewendet werden.

@Repeatable(Universities.class)
public @interface University {
  String name();
}

Der in @Repeatable definierte Wert annotation ist die Container-Annotation. Die Containeranmerkung hat einen variablen Wert vom Array-Typ der obigen wiederholbaren Anmerkung. Hier, Universities sind der enthaltende Anmerkungstyp.

public @interface Universities {
  University[] value();
}

Jetzt die @University Annotation kann mehrmals in derselben Deklaration verwendet werden.

@University(name = "TU")
@University(name = "KU")
private String uniName;

Wenn wir die Anmerkungsdaten abrufen müssen, können wir die Reflection-API verwenden.

Um Anmerkungswerte abzurufen, verwenden wir getAnnotationsByType() oder getAnnotations() Methode, die in der Reflection-API definiert ist.


Java

  1. Java-Datentypen (Primitiv)
  2. Java-Operatoren
  3. Java-Schnittstelle
  4. Java-Versuch-mit-Ressourcen
  5. Java-Anmerkungen
  6. Java-Anmerkungstypen
  7. Java String charAt() Methode mit Beispiel
  8. Java-String-EndsWith()-Methode mit Beispiel
  9. Java String replace(), replaceAll() und replaceFirst() Methode
  10. Java - Variablentypen