Pregled ugrađenih napomena za Java

1. Pregled

U ovom ćemo članku govoriti o osnovnoj značajki jezika Java - zadanim bilješkama dostupnim u JDK.

2. Što je napomena

Jednostavno rečeno, bilješke jesu Tipovi Java kojima prethodi simbol "@".

Java je imala napomene još od izdanja 1.5. Od tada su oblikovali način na koji smo dizajnirali svoje aplikacije.

Proljeće i hibernacija sjajni su primjeri okvira koji se u velikoj mjeri oslanjaju na napomene kako bi omogućili razne tehnike dizajna.

U osnovi, napomena dodjeljuje dodatne metapodatke izvornom kodu za koji je vezana. Dodavanjem napomene metodi, sučelju, klasi ili polju možemo:

  1. Obavijestite sastavljača o upozorenjima i pogreškama
  2. Manipulirajte izvornim kodom u vrijeme sastavljanja
  3. Izmijenite ili ispitajte ponašanje tijekom izvođenja

3. Java ugrađene bilješke

Sad kad smo pregledali osnove, pogledajmo neke napomene koje se isporučuju s jezgrom Java. Prvo, postoji nekoliko onih koji informiraju o kompilaciji:

  1. @Preuzmi
  2. @SuppressWarnings
  3. @Deprecated
  4. @SafeVarargs
  5. @FunctionalInterface
  6. @Native

Te bilješke generiraju ili suzbijaju upozorenja i pogreške kompajlera. Njihova dosljedna primjena često je dobra praksa jer njihovo dodavanje može spriječiti buduće pogreške programera.

The @Preuzmi napomena se koristi da naznači da metoda prevladava ili zamjenjuje ponašanje naslijeđene metode.

@SuppressWarnings označava da želimo zanemariti određena upozorenja iz dijela koda. The @SafeVarargs napomena također djeluje na vrstu upozorenja koja se odnosi na upotrebu vararga.

The @Deprecated napomena se može koristiti za označavanje API-ja kao da više nije namijenjen upotrebi. Štoviše, ova je napomena naknadno ugrađena u Javu 9 kako bi predstavljala više informacija o ukidanju.

Za sve to detaljnije informacije možete pronaći u povezanim člancima.

3.1. @FunctionalInterface

Java 8 omogućuje nam pisanje koda na funkcionalniji način.

Velik su dio sučelja pojedinačne metode sažetka. Ako namjeravamo SAM sučelje koristiti lambdama, po želji ga možemo označiti kao takvo sa @FunctionalInterface:

@FunctionalInterface javno sučelje Adder {int add (int a, int b); }

Kao @Preuzmi s metodama, @FunctionalInterface izjavljuje naše namjere s Guja.

Sad, koristimo li @FunctionalInterface ili ne, još uvijek možemo koristiti Guja na isti način:

Zbrojnik = (a, b) -> a + b; int rezultat = adder.add (4,5);

Ali, ako dodamo drugu metodu Guja, tada će se sastavljač žaliti:

@FunctionalInterface javno sučelje Adder {// kompajler se žali da sučelje nije SAM int add (int a, int b); int div (int a, int b); }

Ovo bi se kompajliralo bez @FunctionalInterface bilješka. Pa, što nam daje?

Kao @Preuzmi, ova nas napomena štiti od buduće pogreške programera. Iako je legalno imati više od jedne metode na sučelju, to nije kada se to sučelje koristi kao lambda cilj. Bez ove napomene, kompajler bi provalio na desetke mjesta gdje Guja je korišten kao lambda. Sada, samo provali Guja sebe.

3.2. @Native

Od Jave 8, nova je napomena u java.lang.notacija paket nazvan Native. The @Native napomena je primjenjiva samo na polja. Označava da je anotirano polje konstanta na koju se može referencirati iz izvornog koda. Na primjer, evo kako se koristi u Cijeli broj razred:

javni završni razred Integer {@Native public static final int MIN_VALUE = 0x80000000; // izostavljeno}

Ova napomena također može poslužiti kao savjet za alate za generiranje nekih pomoćnih datoteka zaglavlja.

4. Meta-bilješke

Dalje, meta-bilješke su napomene koje se mogu primijeniti na druge napomene.

Na primjer, ove meta-bilješke koriste se za konfiguraciju napomena:

  1. @Cilj
  2. @Zadržavanje
  3. @ Naslijeđeno
  4. @Dokumentirano
  5. @Ponovljivo

4.1. @Cilj

Opseg bilješki može se razlikovati ovisno o zahtjevima. Iako se jedna napomena koristi samo s metodama, druga se bilješka može koristiti s deklaracijama konstruktora i polja.

Da bismo odredili ciljne elemente prilagođene bilješke, moramo je označiti s @Cilj bilješka.

@Cilj može raditi s osam različitih vrsta elemenata. Ako pogledamo izvorni kod @SafeVarargs, tada možemo vidjeti da to mora biti pričvršćeno samo na konstruktore ili metode:

@Documented @Retention (RetentionPolicy.RUNTIME) @Target ({ElementType.CONSTRUCTOR, ElementType.METHOD}) public @interface SafeVarargs {}

4.2. @Zadržavanje

Neke su napomene namijenjene korištenju savjeta za kompajler, dok se druge koriste tijekom izvođenja.

Koristimo @Zadržavanje napomena da se kaže gdje se u životnom ciklusu našeg programa primjenjuje naša napomena.

Da bismo to učinili, moramo konfigurirati @Zadržavanje s jednom od tri politike zadržavanja:

  1. RetentionPolicy.SOURCE - vidljiv ni kompajleru ni izvođenju
  2. RetentionPolicy.CLASS - vidljivo u sastavljaču
  3. RetentionPolicy.RUNTIME - vidljiv kompajleru i vremenu izvođenja

@Zadržavanje zadane vrijednosti RetentionPolicy.IZVOR.

Ako imamo napomenu koja bi trebala biti dostupna za vrijeme izvođenja:

@Retention (RetentionPolicy.RUNTIME) @Target (TYPE) public @interface RetentionAnnotation {}

Zatim, ako razredu dodamo neke napomene:

@RetentionAnnotation @Osviještena javna klasa AnnotatedClass {}

Sada možemo razmišljati o tome AnotatedClass da biste vidjeli koliko se bilješki zadržalo:

@Test public void whenAnnotationRetentionPolicyRuntime_shouldAccess () {AnnotatedClass anAnnotatedClass = new AnnotatedClass (); Bilješka [] napomene = anAnnotatedClass.getClass (). GetAnnotations (); assertThat (annotations.length, je (1)); }

Vrijednost je 1 jer @RetentionAnnotation ima politiku zadržavanja od RUNTIME dok @Deprecated nema.

4.3. @ Naslijeđeno

U nekim će nam situacijama možda trebati potklasa da bismo bilješke povezali s roditeljskom klasom.

Možemo koristiti @ Naslijeđeno napomena da bi se naša napomena širila iz označene klase u svoje podrazrede.

Ako se prijavimo @ Naslijeđeno na našu prilagođenu napomenu, a zatim je primijenite na Osnovni razred:

@Inherited @Target (ElementType.TYPE) @Retention (RetentionPolicy.RUNTIME) public @interface InheritedAnnotation {} @InheritedAnnotation javna klasa BaseClass {} javna klasa DerivedClass proširuje BaseClass {}

Zatim, nakon proširenja BaseClass-a, trebali bismo to vidjeti Izvedeni razred čini se da ima istu napomenu tijekom izvođenja:

@Test public void whenAnnotationInherited_thenShouldExist () {DerivedClass derivaClass = new DerivedClass (); Napomena InheritedAnnotation = derivaClass.getClass () .getAnnotation (InheritedAnnotation.class); assertThat (annotation, instanceOf (InheritedAnnotation.class)); }

Bez toga @ Naslijeđeno napomena, gornji test ne bi uspio.

4.4. @Dokumentirano

Prema zadanim postavkama Java ne dokumentira upotrebu bilješki u Javadocsu.

Ali, možemo koristiti @Dokumentirano napomena za promjenu zadanog ponašanja Java.

Ako stvorimo prilagođenu napomenu koja koristi @Dokumentirano:

@Documented @Target (ElementType.FIELD) @Retention (RetentionPolicy.RUNTIME) public @interface ExcelCell {int value (); }

I, primijenite ga na odgovarajući Java element:

javna klasa zaposlenik {@ExcelCell (0) naziv javnog niza; }

Onda Zaposlenik Javadoc će otkriti upotrebu bilješki:

4.5. @Ponovljivo

Ponekad može biti korisno navesti istu napomenu više puta na danom Java elementu.

Prije Jave 7, morali smo grupirati napomene zajedno u jednu napomenu spremnika:

@Schedules ({@Schedule (time = "15:05"), @Schedule (time = "23:00")}) void rasporedAlarm () {}

Međutim, Java 7 donijela je čistiji pristup. S the @Ponovljivo napomena, možemo napomenu ponoviti:

@Repeatable (Schedules.class) public @interface Schedule {String time () default "09:00"; }

Koristiti @Ponovljivo, moramo imati i napomenu spremnika. U ovom ćemo slučaju ponovno upotrijebiti @Rasporedi:

public @interface Schedules {Schedule [] value (); }

Naravno, ovo sliči na ono što smo imali prije Jave 7. Ali, vrijednost je sada taj omot @Rasporedi nije više određeno kad trebamo ponoviti @Raspored:

@Schedule @Schedule (time = "15:05") @Schedule (time = "23:00") void rasporedAlarm () {}

Budući da Java zahtijeva napomenu omotača, bilo nam je lako migrirati s popisa bilješki prije Java 7 na ponovljive bilješke.

5. Zaključak

U ovom smo članku govorili o Java ugrađenim napomenama koje bi svaki programer Jave trebao biti upoznat.

Kao i uvijek, svi primjeri članka mogu se naći na GitHubu.