Den största fördelen med anteckningar kommer inte från att använda de standard som redan finns i JDK. Samtidigt finns det sällan behov av att skapa en egen anteckning. Men om vi utvecklar ett stort system eller skapar ett separat bibliotek, kommer det definitivt att ge utdelning på arkitektonisk nivå att implementera vår egen anteckning.

Låt oss försöka skapa en kommentar.

För att göra detta, skapa en fil, men istället för att skriva klass eller gränssnitt , skriv @gränssnitt . Detta kommer att vara filen för vår kommentar. Den interna strukturen för en kommentar liknar den för ett gränssnitt.


public @interface Sum {
   int sum() default 0;
}

@interface indikerar att detta är en anteckning,
default säger att parametern kommer att ha ett specifikt standardvärde.

Ta-da! Vi skapade en kommentar! Teoretiskt kan vi redan använda det, men först skulle det vara bättre att konfigurera det.

Utan konfiguration kan vår annotering appliceras på vad som helst (på klasser, metoder, attribut, etc.), så det är inte meningsfullt att använda den vid det här laget. Hur konstigt det än kan tyckas, måste vår anteckning förses med andra kommentarer!

Låt oss börja med @Target .

@Target- kommentaren (relevant sedan Java 1.5) begränsar möjligheten att tillämpa en anteckning. För att begränsa användningen till en viss nivå måste vi skicka ett argument till @Target- kommentaren för att indikera vilka typer det kan tillämpas på. Här är några av de vanligaste typerna:

@Target(ElementType.PACKAGE) för paket
@Target(ElementType.TYPE) för klasser
@Target(ElementType.CONSTRUCTOR) för konstruktörer
@Target(ElementType.METHOD) för metoder
@Target(ElementType.FIELD) för attribut (variabler) i en klass
@Target(ElementType.PARAMATER) för metodparametrar
@Target(ElementType.LOCAL_VARIABLE) för lokala variabler

Om du behöver en anteckning för flera typer kan du skicka flera argument som en array:


@Target({ ElementType.PARAMETER, ElementType.LOCAL_VARIABLE })

Nästa viktiga del av konfigurationen är @Retention -kommentaren.

Den här anteckningen anger de delar av kodens livscykel där vår anteckning kommer att vara tillgänglig:

RetentionPolicy.SOURCE Anteckningar märkta med lagringspolicyn SOURCE kasseras under körning.
RetentionPolicy.CLASS Anteckningar markerade med CLASS retention policy skrivs till .class -filen, men tas bort vid körning.
RetentionPolicy.RUNTIME Anteckningar markerade med RUNTIME- lagringspolicyn kvarstår under körning och kan nås i vårt program under körning.

Det finns några fler kommentarer som du kan använda för konfiguration:

Anteckning Värde
@Ärvt Indikerar att en härledd klass ärver en överordnad klasss implementering av anteckningen.
@Dokumenterat Detta indikerar att anteckningen kommer att inkluderas i den genererade Javadoc-dokumentationen.

Låt oss nu försöka skapa vår egen anteckning.

Vi skapar en kommentar som är för klasser och metoder och som innehåller information om kodens författare och version:


    @Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Info {
   String author() default "Author";
   String version() default "0.0";
}

Vi kan tillämpa vår anteckning på metoder och klasser. Vår annoterings metadata kommer att vara tillgänglig under körning. Var uppmärksam på vår antecknings parametrar: Vi kan tillhandahålla två argument (författare och version), eller så kan vi utelämna dem. Om vi ​​utelämnar dem kommer de angivna standardvärdena ( standard "Author" och standard "0.0") att användas.

Det är värt att notera att vi inte behöver ange ett standardvärde för parametrar. I det här fallet blir parametern obligatorisk.

När vi skickar argument måste vi ange motsvarande parameter med hjälp av notationsvärdet = "värde" . Parametern måste alltid namnges explicit, även om anteckningen har en enda parameter.

Låt oss tillämpa vår kommentar på några klasser:


@Info
public class MyClass1 {
   @Info
   public void myClassMethod() {}
}
 
@Info(version = "2.0")
public class MyClass2 {
   @Info(author = "Anonymous")
   public void myClassMethod() {}
}
 
@Info(author = "Anonymous", version = "2.0")
public class MyClass3 {
   @Info(author = "Anonymous", version = "4.0")
   public void myClassMethod() {}
}