Pitanja za intervju s Java Annotations (+ odgovori)

Ovaj je članak dio serije: • Pitanja za intervju za Java Collections

• Pitanja o intervjuu za sustav tipa Java

• Pitanja za intervju s Java-om (+ odgovori)

• Struktura Java razreda i pitanja za intervju za inicijalizaciju

• Java 8 pitanja za intervju (+ odgovori)

• Upravljanje memorijom u Java intervjuu Pitanja (+ odgovori)

• Pitanja o intervjuu za Java Generics (+ odgovori)

• Pitanja za intervju s Java Flow Control (+ odgovori)

• Pitanja o intervjuu za iznimke Java (+ odgovori)

• Pitanja za intervju s Java Annotations (+ odgovori) (trenutni članak) • Najpopularnija proljetna okvirna pitanja za intervju

1. Uvod

Bilješke postoje od Jave 5, a danas su sveprisutni programski konstrukti koji omogućuju obogaćivanje koda.

U ovom ćemo članku pregledati neka pitanja u vezi s napomenama; koji se često traže na tehničkim intervjuima i, gdje je to prikladno; implementirat ćemo primjere kako bismo bolje razumjeli njihove odgovore.

2. Pitanja

Q1. Što su bilješke? Koji su tipični slučajevi njihove upotrebe?

Bilješke su metapodaci vezani za elemente izvornog koda programa i nemaju utjecaja na rad koda kojim upravljaju.

Njihovi tipični slučajevi upotrebe su:

  • Informacije za sastavljača - s napomenama, sastavljač može otkriti pogreške ili suzbiti upozorenja
  • Obrada vremena kompilacije i vremena implementacije - softverski alati mogu obrađivati ​​napomene i generirati kod, konfiguracijske datoteke itd.
  • Runtime obrada - napomene se mogu ispitati tijekom izvođenja kako bi se prilagodilo ponašanje programa

Q2. Opišite neke korisne napomene iz standardne knjižnice.

Postoji nekoliko napomena u java.lang i java.lang.notacija paketi, najčešći uključuju, ali nisu ograničeni na:

  • @Preuzmi - označava da je metoda namijenjena nadjačavanju elementa deklariranog u superklasi. Ako ne uspije pravilno nadjačati metodu, kompajler će izdati pogrešku
  • @Deprecated - označava da je element zastario i da ga se ne smije koristiti. Prevoditelj će izdati upozorenje ako program koristi metodu, klasu ili polje označeno ovom bilješkom
  • @SuppressWarnings - govori sastavljaču da suzbije određena upozorenja. Najčešće se koristi prilikom povezivanja s naslijeđenim kodom napisanim prije pojave generičkih lijekova
  • @FunctionalInterface - uveden u Javi 8, označava da je deklaracija tipa funkcionalno sučelje i čija se implementacija može pružiti pomoću Lambda izraza

Q3. Kako možete stvoriti bilješku?

Bilješke su oblik sučelja u kojem je ključna riječ sučelje prethodi @, a čije tijelo sadrži element tipa bilješke deklaracije koje izgledaju vrlo slično metodama:

public @interface SimpleAnnotation {Vrijednost niza (); int [] tipovi (); }

Nakon što je napomena definirana, yon je može početi koristiti kroz vaš kôd:

@SimpleAnnotation (value = "element", type = 1) element javne klase {@SimpleAnnotation (value = "atribut", type = {1, 2}) javni element nextElement; }

Imajte na umu da, kada pružate više vrijednosti za elemente niza, morate ih priložiti u zagrade.

Po želji se zadane vrijednosti mogu pružiti sve dok su konstantni izrazi kompajleru:

public @interface SimpleAnnotation {String value () default "Ovo je element"; int [] tipovi () zadani {1, 2, 3}; }

Anotaciju sada možete koristiti bez tih elemenata:

@SimpleAnnotation element javne klase {// ...}

Ili samo neki od njih:

@SimpleAnnotation (value = "atribut") javni element nextElement;

Q4. Koje se tipove objekata mogu vratiti iz izjave metode bilježenja?

Tip povrata mora biti primitivan, Niz, Razred, Enumili niz jednog od prethodnih tipova. U suprotnom, kompajler će izbaciti pogrešku.

Evo primjera koda koji uspješno slijedi ovo načelo:

enum Složenost {LOW, HIGH} public @interface ComplexAnnotation {Vrijednost klase (); int [] tipovi (); Složenost složenosti (); }

Sljedeći primjer neće uspjeti sastaviti od Objekt nije valjana vrsta povrata:

public @interface FailingAnnotation {Složenost objekta (); }

P5. Koji se programski elementi mogu označiti?

Bilješke se mogu primijeniti na nekoliko mjesta u cijelom izvornom kodu. Mogu se primijeniti na deklaracije klasa, konstruktora i polja:

@SimpleAnnotation javna klasa Apply {@SimpleAnnotation private String aField; @SimpleAnnotation public Apply () {// ...}}

Metode i njihovi parametri:

@SimpleAnnotation public void aMethod (@SimpleAnnotation String param) {// ...}

Lokalne varijable, uključujući petlju i varijable resursa:

@SimpleAnnotation int i = 10; za (@SimpleAnnotation int j = 0; j <i; j ++) {// ...} pokušajte (@SimpleAnnotation FileWriter Writer = getWriter ()) {// ...} catch (Exception ex) {// .. .}

Ostale vrste bilješki:

@SimpleAnnotation public @interface ComplexAnnotation {// ...}

Pa čak i paketi, putem package-info.java datoteka:

@PackageAnnotation paket com.baeldung.interview.annotations;

Od Jave 8 oni se mogu primijeniti i na koristiti vrsta. Da bi ovo funkcioniralo, napomena mora navesti @Cilj bilješka s vrijednošću ElementType.USE:

@Target (ElementType.TYPE_USE) public @interface SimpleAnnotation {// ...}

Sada se napomena može primijeniti na stvaranje instance klase:

novi @SimpleAnnotation Apply ();

Tipski odljevci:

aString = (@SimpleAnnotation String) nešto;

Klauzula o provedbi:

javna klasa SimpleList implementira @SimpleAnnotation List {// ...}

I baca klauzula:

void aMethod () baca izuzetak @SimpleAnnotation {// ...}

P6. Postoji li način da se ograniče elementi u kojima se bilješka može primijeniti?

Da, @Cilj U tu se svrhu može koristiti bilješka. Ako pokušavamo upotrijebiti bilješku u kontekstu u kojem ona nije primjenjiva, sastavljač će izdati pogrešku.

Evo primjera za ograničavanje upotrebe @SimpleAnnotation napomena samo za deklaracije polja:

@Target (ElementType.FIELD) public @interface SimpleAnnotation {// ...}

Možemo proslijediti više konstanti ako ga želimo učiniti primjenjivim u više konteksta:

@Target ({ElementType.FIELD, ElementType.METHOD, ElementType.PACKAGE})

Možemo čak i napraviti bilješku tako da se ona ne može koristiti za bilo što. Ovo može dobro doći kada su deklarirani tipovi namijenjeni isključivo za upotrebu kao tip člana u složenim bilješkama:

@Target ({}) public @interface NoTargetAnnotation {// ...}

P7. Što su meta-bilješke?

Jesu li napomene koje se primjenjuju na ostale napomene.

Sve bilješke koje nisu označene @Cilj, ili su njime označeni, ali uključuju ANOTACIJA_TIP konstanta su i meta-bilješke:

@Target (ElementType.ANNOTATION_TYPE) public @interface SimpleAnnotation {// ...}

P8. Što su ponavljajuće bilješke?

To su napomene koje se mogu primijeniti više puta na istu deklaraciju elementa.

Iz razloga kompatibilnosti, otkad je ova značajka uvedena u Javi 8, ponavljajuće se bilješke pohranjuju u bilješka spremnika koji automatski generira Java kompajler. Da bi prevodilac to učinio, dva su koraka da ih deklariraju.

Prvo, moramo proglasiti ponovljivu napomenu:

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

Zatim definiramo napomenu koja sadrži obvezno vrijednost element, a čiji tip mora biti niz ponavljajućeg tipa bilješke:

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

Sada @Schedule možemo koristiti više puta:

@Schedule @Schedule (time = "afternoon") @Schedule (time = "night") void rasporedMethod () {// ...}

P9. Kako možete dobiti bilješke? Kako se ovo odnosi na njegovu politiku zadržavanja?

Da biste preuzeli napomene, možete upotrijebiti API za refleksiju ili procesor napomena.

The @Zadržavanje bilješka i njezina RetentionPolicy parametar utječe na način na koji ih možete dohvatiti. Postoje tri konstante u RetentionPolicy nabrajanje:

  • RetentionPolicy.IZVOR - čini da napomena odbaci kompajler, ali ih obrađivači napomena mogu pročitati
  • RetentionPolicy.CLASS - označava da je napomena dodana u datoteku razreda, ali da joj nije moguće pristupiti refleksijom
  • RetentionPolicy.RUNTIME –Annotacije bilježi u datoteku klase prevodilac, a JVM zadržava u vrijeme izvođenja tako da ih se može reflektirano čitati

Evo primjera koda za stvaranje napomene koja se može čitati tijekom izvođenja:

@Retention (RetentionPolicy.RUNTIME) public @interface Opis {String value (); }

Anotacije se sada mogu dobiti refleksijom:

Opis opisa = AnnotatedClass.class.getAnnotation (Description.class); System.out.println (description.value ());

Procesor napomena može raditi s RetentionPolicy.IZVOR, to je opisano u članku Java Annotation Processing and Creating Builder.

RetentionPolicy.CLASS je korisno kada pišete Java parser bytecode.

Q10. Hoće li se sastaviti sljedeći kod?

@Target ({ElementType.FIELD, ElementType.TYPE, ElementType.FIELD}) public @interface TestAnnotation {int [] value () default {}; }

Ne. To je pogreška vremena kompajliranja ako se ista enum konstanta pojavi više puta u @Cilj bilješka.

Uklanjanjem duplikata konstante učinit će da se kod uspješno prevede:

@Target ({ElementType.FIELD, ElementType.TYPE})

Q11. Je li moguće proširiti bilješke?

Ne. Bilješke se uvijek protežu java.lang.annotation.Anotacija, kako je navedeno u Specifikaciji jezika Java.

Ako pokušamo koristiti proteže se klauzule u deklaraciji napomena, dobit ćemo pogrešku pri kompilaciji:

public @interface AnAnnotation proširuje OtherAnnotation {// Pogreška kompilacije}

Zaključak

U ovom smo članku pokrili neka od često postavljanih pitanja koja se pojavljuju u tehničkim intervjuima za programere Java u vezi s napomenama. Ovo nikako nije iscrpan popis i treba ga smatrati samo početkom daljnjeg istraživanja.

Mi iz tvrtke Baeldung želimo vam uspjeh u svim nadolazećim intervjuima.

Sljedeći » Najpopularnija pitanja za proljetni okvirni intervju « Prethodna pitanja o intervjuima za iznimke Java (+ odgovori)

$config[zx-auto] not found$config[zx-overlay] not found