Kommentar (Java)

I forbindelse med Java- programmeringsspråket er kommentar et språkelement som gjør at metadata kan inkorporeres i kildeteksten . Dette elementet ble definert i JSR 175 og introdusert med versjon Java 5.0.

Kommentarer begynner med et @ -tegn. Dette blir etterfulgt av navnet hennes. Eventuelt kan en kommadelt parameterliste, som er lukket i runde parenteser, følge. For eksempel markerer merknaden i følgende kildekodeutdrag klasse A som utdatert :

@Deprecated
public class A {}

En kommentarprosessor er en kompilator-plugin-modul som kan evaluere merknader under kompilering for å undertrykke eller utløse advarsler og feilmeldinger eller generere ekstra kildekode eller andre filer. Han kan imidlertid ikke endre kommentert kode. Kommentarer som dette er ment for kan også evalueres i løpetid ved hjelp av refleksjon .

Merknader brukes blant annet i Jakarta EE- miljøet for å legge til informasjon til klasser som måtte lagres i separate filer før Java 5. Fremtredende eksempler er hjemlige og lokale grensesnitt samt distribusjonsbeskrivere.

En tidligere teknikk for å bygge inn metadata i Java-kildekoden er bruken av spesielle Javadoc- kommentarer. Disse ble evaluert ved hjelp av såkalte doclets . Et mye brukt verktøy for denne metoden er XDoclet . Denne teknikken kan fortsatt brukes etter introduksjonen av kommentarene.

Forhåndsdefinerte merknader

I Java SE 5.0 er syv forhåndsdefinerte merketyper tilgjengelige, i pakkene ( pakken ) java.langeller java.lang.annotationløgnen. I motsetning til de fleste kommentarene blir de alle evaluert av kompilatoren. Programmører kan lage mer.

Kommentar beskrivelse
java.langDet er merknader i pakken .
@Foreldet Dette kan brukes til å merke klasser, attributter eller metoder som ikke lenger skal brukes. Kompilatoren sender deretter en advarsel hvis et element som er merket på denne måten blir brukt.

Det anbefales også å legge til en Javadoc- kommentar som viser hvordan det tilsvarende elementet skal byttes ut. Følgende eksempel viser dette:

/**
 * @deprecated  Die Klasse A wurde mit Version 10.3 durch die Klasse ANeu ersetzt.
 */
@Deprecated
public class A {}
@Overstyring Denne typen kan brukes til å identifisere en metode som overskriver metoden til superklassen. Kompilatoren sørger da for at superklassen inneholder denne metoden og returnerer en feil hvis den ikke gjør det.

Eksempel:

public class A {
    public void eineMethode() {}
}
 
public class B extends A {
    @Override
    public void eineMethode() {}
}
@SuppressWarnings Når du bruker denne typen merknader, undertrykker kompilatoren visse advarsler. En matrise med strenger som inneholder advarslene som skal undertrykkes, overføres til kommentaren.

Det følgende eksempel instruerer kompilatoren å undertrykke den avviklede advarsel for ADeprecatedClass klasse:

public class A {
    @SuppressWarnings({"deprecation"})
    public void eineMethode() {
        EineDeprecatedKlasse b = new EineDeprecatedKlasse();
    }
}
@SafeVarargs Denne merknaden sikrer at Varargs-parametrene med generiske stoffer ikke erstattes med en uegnet generisk type ved kjøretid. Ingen advarsel vises da når metoden eller konstruktøren kalles. Merknaden ble introdusert med Java 7. Opp til Java 6 kan du dokumentere tilliten til den ringte koden når du ringer med en @ SuppressWarnings-kommentar, fra Java 7 kan metoden erklære seg selv som pålitelig.
I pakken java.lang.annotation- disse brukes bare til å definere merknader.
@Dokumentert Denne merketypen brukes som metaanmerking: En merknad av denne typen angir for en nylig opprettet merketype at den blir tatt i betraktning av Javadoc når dokumentet genereres.
@Arvet Denne typen kommentar brukes når du programmerer en kommentar. Dette kan brukes til å spesifisere at dette arves sammen med en klasse. Hvis denne merknaden brukes for eksempel for en bestemt klasse, gjelder den også for alle klasser som arver fra den.
@Bevaring Denne typen brukes når du programmerer en kommentar. Den indikerer når den er tilgjengelig av seg selv. Det er tre mulige verdier for en kommentar av denne typen, som er oppført i oppregningen java.lang.annotation.RetentionPolicy :
KLASSE
Merknaden er samlet med klassen og er derfor tilgjengelig i .class-filen. Det kan imidlertid ikke leses opp mens et program kjører. Dette er standard.
RUNTIME
Merknaden kan leses ut i løpet av applikasjonen ved hjelp av refleksjonsmekanismen .
KILDE
Merknaden fjernes fra kildekoden før kompilering. Følgelig er den ikke tilgjengelig når et program kjører.
@Mål Denne typen kommentar brukes når du programmerer en kommentar. Dette definerer hvilke elementer i et program det kan brukes på. De mulige verdiene for en kommentar av denne typen er oppført i nummereringen java.lang.annotation.ElementType.
TYPE
Merknaden kan bare brukes på klasser, grensesnitt eller oppføringer.
FELT
Merknaden kan bare brukes på felt.
METODE
Merknaden kan bare brukes på metoder. Konstruktører er ekskludert.
PARAMETER
Merknaden kan bare brukes på parametere for metoder og konstruktører.
BYGGER
Merknaden kan bare brukes på konstruktører.
LOCAL_VARIABLE
Merknaden kan bare brukes på lokale variabler.
ANNOTATION_TYPE
Merknaden kan bare brukes på merknader.
PAKKE
Merknaden kan bare brukes på pakker.

Definisjon av dine egne kommentarer

Kommentarer er spesielle grensesnitt; I følge konvensjonen er navnene deres skrevet med store bokstaver. I avtalen deres er interfacedet tegnet @. De utvider implisitt grensesnittet java.lang.annotation.Annotation. De må ikke utvide (dvs. extendser forbudt) andre grensesnitt og er ikke generiske. Metodene deres er parameterløse og ikke-generiske. Bare resultattyper er tillatt som resultattyper (returtype):

  • primitive typer
  • Oppregningstyper ( enum)
  • Kommentarer
  • String
  • Class
  • Felter (matriser) fra disse typene

De kaster heller ikke unntak og har ikke lov til å bruke rekursjon.

Mange kommentarer inneholder ingen metoder. Et eksempel kan være:

@interface Vorlaeufig { }

Andre merknader inneholder metoder (som vanlig for grensesnitt), men bare med resultattypene som er oppført ovenfor. I henhold til konvensjonen, hvis en kommentar bare inneholder en metode, er navnet value:

@interface Test {
	boolean value(); // true solange nicht freigegeben
}

eller

@interface Autoren {
	String[] value(); // Namen der Autoren
}

eller

@interface Kunden {
	Person[] value();
}

der personen enummå defineres som enumerasjonstype ( ) eller kommentar, f.eks. B.:

@interface Person {
	String name();
	int alter();
}

Når du blir enige om merknader, java.lang.annotationbrukes ofte standardkommentarene fra pakken . Spesielt bør det @Retentionspesifiseres hvor lenge merknaden skal oppbevares: bare i kildekoden ( SOURCE), i den lagrede klassefilen ( CLASS) eller også i den lastede klassen ( RUNTIME). @Targetbeskriver hvilke programelementer kommentaren kan brukes. For eksempel er alle merkeavtaler i pakken java.lang.annotationmed merknadene

@Documented
@Retention(value=RUNTIME)
@Target(value=ANNOTATION_TYPE)

Feil. Som et resultat blir de alle evaluert av javadoc, lastet i bytekoden og kan dermed evalueres i løpetid; i tillegg kan de bare brukes til merknader.

Bruk av dine egne kommentarer

En kommentar uten metoder, slik som @Vorlaeufigf.eks. B. plasseres foran en klasse:

@Vorlaeufig
class Klasse {
	void methode();
}

En kommentar med bare en metode med navnet valuemå gis en konstant verdi av resultattypen for denne metoden i parentes:

@Test(true)
public void methode() { ... }

Hvis resultattypen er en matrise, bør en bokstavelig matrise brukes:

@Autoren({"Solymosi", "Grude"})
String buch = "Algorithmen und Datenstrukturen mit Java"

Hvis matrisen ikke inneholder noen elementer, må den også ({})spesifiseres. Men hvis matrisen bare inneholder ett element, kan de krøllete bukkene utelates:

@Autoren("Solymosi")
String anderesBuch = "Programmieren in Scala"

En kommentar med flere metoder må tilordnes en konstant verdi i parentes til hver av metodene:

@Person(name = "Andreas Solymosi", alter = 56)
Konto konto = new Konto();

Alternativet for å spesifisere verdien etter navn er også tilgjengelig for merknader med en metode (det er imidlertid overflødig, høyst for lesbarhet):

@Test(value = true)

En kompleks (nestet) kommentar må brukes nestet:

@Kunden(@Person(name = "Andreas Solymosi", alter = 56))
class Unternehmen {  }

Standardverdier kan defineres for metodene i kommentaravtalen; deretter kan den tilsvarende verdien utelates når den brukes. Siden merknader er grensesnitt, kan de merkes med merknader selv:

@Autoren("Solymosi")
public @interface Test {
	boolean wert() default false; // muss nicht unbedingt wert heißen
}

Evaluering av merknader

Hvis kommentarene er lastet med klassens bytekode, kan de evalueres ved hjelp av refleksjon. Du kan for eksempel bestemme om en kommentar ble spesifisert eller ikke:

boolean vorlaeufig = Klasse.class.isAnnotationPresent(Vorlaeufig.class);

Når du har bestemt at merknaden er der, kan du også lese verdien, f.eks. B. om metoden fremdeles er i testtilstand eller ikke:

boolean imTestzustand = Klasse.class.getMethod("methode", new Class[]{}).getAnnotation(Test.class).value();

Hvis kommentaren ikke eksisterer, heves getAnnotation()unntaket NullPointerException. Elementene må velges individuelt fra en kompleks kommentar:

Person kunden = Unternehmen.class.getAnnotation(Kunden.class).value()[0];

Kommentar av pakker

Med Java Language Specification kan pakker kommenteres, for eksempel for å gi dokumentasjon for en pakke. Maksimalt én packageerklæring kan kommenteres per pakke . Hvis en pakke skal motta kommentarer, anbefaler Java Language Specification at du oppretter en egen fil package-info.javai katalogen til denne pakken. Denne filen inneholder deretter packageerklæringen med kommentarene.

weblenker