Programovanie

Spoločná funkčnosť objektov Java s projektom Lombok

Project Lombok je malá knižnica, ktorú je možné použiť na zníženie množstva štandardného kódu Java, ktorý sa bežne píše pre triedy Java. Project Lombok to robí pomocou anotácií, ktoré je možné pridať do triedy Java, pre ktorú sú požadované bežné metódy. Väčšina anotácií má vo svojom názve popisný charakter: @Getter, @Setter, @EqualsAndHashCode, @ToString a @NoArgsConstructor sú príklady. V tomto príspevku demonštrujem použitie jednoduchých anotácií Lombok na pridanie týchto bežne písaných metód do triedy Java.

Tu je jednoduchá trieda bez preddefinovanej prepísanej verzie toString ().

toString-less Person.java

balenie zásypu.príklady; / ** * Trieda jednoduchých osôb bez štítku s platňami. * * @author Dustin * / verejná trieda Osoba {private String priezvisko; private String meno; } 

Keď sa vygeneruje vyššie uvedená trieda a zavolá sa jej implicitne zdedená metóda (z Object) toString (), výstup bude vyzerať ako na nasledujúcom obrázku.

Mohli by sme napísať explicitnú metódu toString () alebo použiť Project Lombok. Nasledujúci úryvok kódu demonštruje prístup projektu Lombok.

Person.java s anotáciou Lombok @ToString

balenie zásypu.príklady; importovať lombok.ToString; / ** * Trieda jednoduchých osôb bez štítku s platňami. * * @author Dustin * / @ToString verejná trieda Osoba {private String priezvisko; private String meno; } 

Ďalej sa zobrazí výstup z tlače obsahu tejto triedy pomocou Lombok-toString ().

Teraz je lepšie toString () reprezentácia objektu Person, ale jeho polia stále nie sú inicializované, takže vidíme iba nulové hodnoty. Na vytvorenie konštruktora môžeme opäť použiť Lombok.

Person.java s poznámkou spoločnosti Lombok @AllArgsConstructor

balenie zásypu.príklady; import lombok.AllArgsConstructor; importovať lombok.ToString; / ** * Trieda jednoduchých osôb bez štítku s platňami. * * @author Dustin * / @ToString @AllArgsConstructor verejná trieda Osoba {súkromný reťazec priezvisko; private String meno; } 

Teraz môžem (v skutočnosti musím) odovzdať parametre po vytvorení inštancie objektu Person. Výsledky sa zobrazia na nasledujúcom obrázku na obrazovke. V tomto prípade môj kód klienta (Main.java) zobrazuje chybu v kompilácii v NetBeans, pretože NetBeans neverí, že v Persone je akceptovateľ dva reťazce, ktorý je konštruktor. Napriek červeným skresleným znakom sa kód stavia, keď požiadam NetBeans o jeho zostavenie.

Trieda ako Person.java je často dátovou triedou, ktorú bude treba použiť pri porovnávaní a prípadne pri zbieraní kľúčov založených na hashCode. Je dôležité správne vytvárať implementácie equals (Object) a hashCode () a ubezpečiť sa, že sú vytvárané spoločne. Pretože existujú predvolené metódy equals a hashCode poskytované rodičovskou triedou Object, kód Java pomocou inštancií Person bude schopný vykonávať equals a / alebo hashCode, ale nie je pravdepodobné, že by skutočne chceli. Keď sa hlavná spustiteľná trieda zmení na nasledujúci výpis kódu, uvidíme výstup po tomto, ktorý nám hovorí, že porovnanie rovnosti sa robí úplne skôr na základe identity ako obsahu.

Main.java, ktorá sa rovná implementácii ()

balenie zásypu.príklady; importovať statický java.lang.System.out; / ** * Jednoduchá hlavná pre použitie tried poháňaných projektom Lombok. * * @author Dustin * / public class Main {public static void main (final String [] argumenty) {// final Person person = new Person (); konečná osoba osoba = nová osoba ("míle", "Linda"); out.println (osoba); final String sameLastName = "Smith"; final String sameFirstName = "Sam"; konečná osoba person1 = nová osoba (sameLastName, sameFirstName); konečná osoba person2 = nová osoba (sameLastName, sameFirstName); if (person1.equals (person2)) {out.println ("Rovnaká osoba!"); } else {out.println ("Rôzni ľudia!"); }}} 

Toto je takmer nikdy to, čo sa tu požaduje. Namiesto toho sa vyžaduje výslovná implementácia rovná sa. Páči sa mi, že anotácia Lombok, @EqualsAndHashCode, generuje iba obe tieto hodnoty spoločne, pretože nemá zmysel ich výslovne prepísať jednotlivo. Ďalej sa zobrazí zoznam tried Person.java s pridaním anotácie @EqualsAndHashCode.

Person.java s @EqualsAndHashCode

balenie zásypu.príklady; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; importovať lombok.ToString; / ** * Trieda jednoduchých osôb bez štítku s platňami. * * @author Dustin * / @ToString @AllArgsConstructor @EqualsAndHashCode verejná trieda Osoba {private String priezvisko; private String meno; } 

Výstup je teraz lepší.

Stále nemám dobrý spôsob prístupu ku každému verejnému poľu zvlášť, ak je to potrebné. Napríklad, ak by som chcel vo svojom kóde urobiť niečo na základe priezviska, nemám dobrý spôsob, ako sa k tomu dostať bez toho, aby som urobil rázne kroky. Môžem tu znova použiť Lombok.

V tomto príklade predpokladáme, že sme vytvorili chybný predpoklad, že sa môže meniť iba priezvisko osoby. Z tohto dôvodu predpokladáme, že pre priezvisko poskytneme iba anotáciu Lombok @Setter, ale pre obe polia poskytneme anotáciu @Getter. Ďalej sa zobrazí zmenený kód osoby.

Person.java s @Getter a @Setter

balenie zásypu.príklady; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Získajte; import lombok.Setter; importovať lombok.ToString; / ** * Trieda jednoduchých osôb bez štítku s platňami. * * @author Dustin * / @ToString @AllArgsConstructor @EqualsAndHashCode verejná trieda Osoba {@Getter @Setter súkromný reťazec priezvisko; @ Zadajte súkromný reťazec firstName; } 

Tu je aktualizovaná hlavná trieda na spustenie tohto príkladu:

Main.java, ktorá využíva New Setter / Getter

balenie zásypu.príklady; importovať statický java.lang.System.out; / ** * Jednoduchá hlavná pre použitie tried podporovaných projektom Lombok. * * @author Dustin * / public class Main {public static void main (final String [] argumenty) {// final Person person = new Person (); konečná osoba osoba = nová osoba ("míle", "Linda"); out.println (osoba); final String sameLastName = "Smith"; final String sameFirstName = "Sam"; konečná osoba person1 = nová osoba (sameLastName, sameFirstName); konečná osoba person2 = nová osoba (sameLastName, sameFirstName); if (person1.equals (person2)) {out.println ("Rovnaká osoba!"); } else {out.println ("Rôzni ľudia!"); } konečná osoba sprístupnenáPerson = nová osoba ("Garzminski", "Gary"); out.println ("Priezvisko je" + accessiblePerson.getLastName ()); out.println ("Krstné meno je" + accessiblePerson.getFirstName ()); //accessiblePerson.setFirstName("Grady "); accessPerson.setLastName ("Garfunkel"); out.println ("Nové priezvisko je" + accessiblePerson.getLastName ()); }} 

Musel som hovor okomentovať, aby som nastavil meno osoby, aby sa kód vytvoril. Teraz beží tak, ako je to znázornené na nasledujúcej snímke obrazovky.

Je pravdepodobné, že táto zbierka anotácií Lombok by bola bežne žiadaná, najmä pre triedy orientované na údaje. Z tohto dôvodu Project Lombok poskytuje agregované anotácie, napríklad @Data, ktoré poskytujú zbierku týchto anotácií. V takom prípade som sa pomocou aplikácie @Data mohol dostať do veľmi podobného správania ako niekoľko jednotlivých anotácií, ktoré som uviedol. Anotácia @Data vedie k tomu, že Lombok použije @Getter na všetky polia a @Setter na všetky nedefinované polia. Ďalším hlavným rozdielom od toho, čo som použil, je to, že používa @RequiredArgsConstructor namiesto @AllArgsConstructor.

Jedným z najlepších spôsobov, ako zistiť, čo Project Lombok urobil s kompilovaným súborom .class, je použitie javapu. Toto sa zobrazuje na nasledujúcej snímke obrazovky.

Na tomto výstupe vidíme, že v zostavenej Person.class je k dispozícii množstvo metód, ktoré sa bežne vyskytujú ako štandardný kód. Existuje dvojparametrový parametrizovaný konštruktor hashCode (), equals (Object), toString () a očakávané metódy get a set.

Projekt Lombok nie je bez obáv a obmedzení. Mnohé z nich sú vyjadrené v reakciách na príspevok Hamleta D'Arcyho Java bez variča - projekt Lombok. Jedným obmedzením je znížená podpora v iných IDE ako Eclipse (aj keď existuje slušná podpora NetBeans a je podporovaný javac). Znepokojuje ich potreba, aby ostatní používajúci a udržiavajúci kód mali novú závislosť od Lomboku. Túto obavu možno trochu zmierniť použitím delomboku, ktorý by sa v prípade potreby mohol použiť v procese vytvárania.

Medzi ďalšie články a blogové príspevky týkajúce sa projektu Lombok patria projekt Lombok - už nikdy nepíš kód Java Boilerplate, Java bez štítku - Project Lombok, Project Lombok: Bye Bye Boilerplate, rozhovor Lombok s projektom Java Posse, Project Lombok: Ukončite výrečnosť Java , Project Lombok - musíte mať vo svojej Java Toolkit, Project Lombok: Zaujímavé skratky Bean s procesorom anotácií, Rozhovor: Reinier a Roel na Lomboku, Zníženie kódu Boilerplate pomocou Project Lombok, Rýchly vývoj pomocou Lombok, Lombok Zníži váš kód Kotla a Lepšia alternatíva pre getrov a setrov.

Tento príbeh, „Spoločná funkčnosť objektov Java v projekte Lombok“, bol pôvodne publikovaný spoločnosťou JavaWorld.

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