Programování

Společná funkčnost objektu Java s projektem Lombok

Project Lombok je malá knihovna, kterou lze použít ke snížení množství standardního kódu Java, který je běžně psán pro třídy Java. Project Lombok to dělá prostřednictvím anotací, které lze přidat do třídy Java, pro které jsou požadovány běžné metody. Většina anotací má ve svých názvech popisný charakter: @Getter, @Setter, @EqualsAndHashCode, @ToString a @NoArgsConstructor jsou příklady. V tomto příspěvku demonstruji použití jednoduchých anotací Lombok k přidání těchto běžně psaných metod do třídy Java.

Tady je jednoduchá třída bez předdefinované přepsané verze toString ().

toString-less Person.java

příklady zásilky; / ** * Třída Simple Person bez standardního štítku. * * @author Dustin * / veřejná třída Osoba {soukromý řetězec příjmení; private String firstName; } 

Když se vygeneruje výše uvedená třída a zavolá se její implicitně zděděná (od Object) metody toString (), výstup vypadá jako ten, který je uveden na dalším obrázku.

Mohli bychom napsat explicitní metodu toString () nebo použít Project Lombok. Další fragment kódu demonstruje přístup Project Lombok.

Person.java s poznámkou Lombok @ToString

příklady zásilky; importovat lombok.ToString; / ** * Třída Simple Person bez standardního štítku. * * @author Dustin * / @ToString veřejná třída Osoba {soukromý řetězec příjmení; private String firstName; } 

Dále se zobrazí výstup z tisku obsahu této třídy pomocí Lombok-toString ().

Nyní je lepší toString () reprezentace objektu Person, ale jeho pole stále nejsou inicializována, takže vidíme pouze nulové hodnoty. Lombok můžeme znovu použít k vytvoření konstruktoru.

Person.java s poznámkou Lombok @AllArgsConstructor

příklady zásilky; importovat lombok.AllArgsConstructor; importovat lombok.ToString; / ** * Třída Simple Person bez standardního štítku. * * @author Dustin * / @ToString @AllArgsConstructor veřejná třída Osoba {soukromý řetězec příjmení; private String firstName; } 

Nyní mohu (ve skutečnosti musím) předat parametry po vytvoření instance objektu Person. Výsledky se zobrazí na dalším obrázku obrazovky. V tomto případě můj klientský kód (Main.java) zobrazuje chybu v době kompilace v NetBeans, protože NetBeans nevěří, že v Personu existuje konstruktor, který přijímá dva řetězce. Navzdory červeným skvrnitým značkám se kód staví, když požádám NetBeans o jeho sestavení.

Třída, jako je Person.java, je často datovou třídou, kterou je třeba použít při porovnávání a případně klíčech kolekce založených na hashCode. Je důležité správně vytvářet implementace equals (Object) a hashCode () a zajistit, aby byly vytvořeny společně. Protože existují výchozí metody equals a hashCode poskytované nadřazenou třídou Object, kód Java pomocí instancí Person bude schopen provádět equals a / nebo hashCode, ale není pravděpodobné, že by to, co opravdu chce. Když je hlavní spustitelná třída změněna na další výpis kódu, vidíme výstup po tom, který nám říká, že srovnání rovnosti se provádí úplně na základě identity, nikoli na obsahu.

Main.java, že testy se rovná () implementace

příklady zásilky; importovat statický java.lang.System.out; / ** * Jednoduchá hlavní pro použití tříd poháněných projektem Lombok. * * @author Dustin * / public class Main {public static void main (final String [] argumenty) {// final Person person = new Person (); konečná osoba osoba = nová osoba ("Miles", "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 ("Stejná osoba!"); } else {out.println ("Různí lidé!"); }}} 

To je téměř nikdy to, co se zde chce. Místo toho je vyžadována implementace explicitně se rovná. Líbí se mi skutečnost, že anotace Lombok k tomu, @EqualsAndHashCode, generuje pouze oba dohromady, protože nemá smysl je výslovně přepsat jednotlivě. Seznam tříd Person.java se zobrazí dále s přidáním anotace @EqualsAndHashCode.

Person.java s @EqualsAndHashCode

příklady zásilky; importovat lombok.AllArgsConstructor; importovat lombok.EqualsAndHashCode; importovat lombok.ToString; / ** * Třída Simple Person bez standardního štítku. * * @author Dustin * / @ToString @AllArgsConstructor @EqualsAndHashCode veřejná třída Osoba {private String lastName; private String firstName; } 

Výstup je nyní lepší.

Stále nemám dobrý způsob, jak v případě potřeby přistupovat ke každému veřejnému poli zvlášť. Například pokud bych chtěl něco udělat ve svém kódu na základě příjmení, nemám dobrý způsob, jak se k tomu dostat, aniž bych podnikl drastické kroky. Lombok zde mohu znovu použít.

V tomto příkladu předpokládáme, že jsme vytvořili chybný předpoklad, že se může změnit pouze příjmení dané osoby. Z tohoto předpokladu poskytneme pouze anotaci Lombok @Setter pro příjmení, ale poskytneme anotaci @Getter pro obě pole. Změněný kód osoby se zobrazí dále.

Person.java s @Getter a @Setter

příklady zásilky; importovat lombok.AllArgsConstructor; importovat lombok.EqualsAndHashCode; importovat lombok.Getter; importovat lombok.Setter; importovat lombok.ToString; / ** * Třída Simple Person bez standardního štítku. * * @author Dustin * / @ToString @AllArgsConstructor @EqualsAndHashCode veřejná třída Osoba {@Getter @Setter soukromý řetězec lastName; @ Získejte soukromý řetězec firstName; } 

Zde je aktualizovaná hlavní třída pro spuštění tohoto příkladu:

Main.java, která využívá nový setr / getr

příklady zásilky; importovat statický java.lang.System.out; / ** * Jednoduchá hlavní pro použití tříd poháněných projektem Lombok. * * @author Dustin * / public class Main {public static void main (final String [] argumenty) {// final Person person = new Person (); konečná osoba osoba = nová osoba ("Miles", "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 ("Stejná osoba!"); } else {out.println ("Různí lidé!"); } konečná osoba accessPerson = nová osoba ("Garzminski", "Gary"); out.println ("Příjmení je" + accessiblePerson.getLastName ()); out.println ("Křestní jméno je" + accessiblePerson.getFirstName ()); //accessiblePerson.setFirstName("Grady "); accessPerson.setLastName ("Garfunkel"); out.println ("Nové příjmení je" + accessiblePerson.getLastName ()); }} 

Musel jsem hovor okomentovat, abych nastavil křestní jméno osoby tak, aby se kód stavěl. Nyní běží, jak je znázorněno na následujícím snímku obrazovky.

Je pravděpodobné, že by tato kolekce Lombokových anotací byla běžně žádaná, zejména pro datově orientované třídy. Z tohoto důvodu Project Lombok poskytuje agregované anotace, jako je @Data, které poskytují kolekci těchto anotací. V tomto případě jsem mohl získat velmi podobné chování několika individuálním anotacím, které jsem poskytl pomocí @Data. Anotace @Data vede k tomu, že Lombok použije @Getter na všechna pole a @Setter na všechna nedefinovaná pole. Dalším hlavním rozdílem od toho, co jsem použil, je to, že používá @RequiredArgsConstructor spíše než @AllArgsConstructor.

Jedním z nejlepších způsobů, jak zjistit, co Project Lombok udělal s kompilovaným souborem .class, je použití javapu. To se zobrazí na dalším snímku obrazovky.

V tomto výstupu vidíme, že v kompilované Person.class je k dispozici spousta metod běžně viděných standardních kódů. K dispozici je konstruktor parametrizovaný dvěma argumenty, hashCode (), equals (Object), toString () a očekávané metody get a set.

Project Lombok není bez obav a omezení. Mnohé z nich jsou vyjádřeny v odpovědích na příspěvek Hamleta D'Arcyho Java Without the Boilerplate - Project Lombok. Jedním z omezení je omezená podpora v jiných IDE než Eclipse (i když existuje slušná podpora NetBeans a je podporován javac). Znepokojení je potřeba pro ostatní, kteří používají a udržují kód, aby měli novou závislost na Lomboku. Tuto obavu lze poněkud zmírnit použitím delomboku, který lze v případě potřeby použít v procesu sestavení.

Mezi další články a příspěvky na blogu, které pokrývají Project Lombok, patří Project Lombok - už nikdy nepsejte kód Java Boilerplate, Java bez štítku - Project Lombok, Project Lombok: Bye Bye Boilerplate, Interview projektu Java Lombok, Project Lombok: Ukončete výřečnost Java , Project Lombok - musíte mít ve své sadě Java Toolkit, Project Lombok: Zajímavé zkratky Bean s anotačním procesorem, Rozhovor: Reinier a Roel na Lomboku, Snížení kódu Boilerplate s Project Lombok, Rychlý vývoj s Lombok, Lombok Snižuje váš kód Boilerplate, a Lepší alternativa pro getry a settery.

Tento příběh „Společná funkčnost objektu Java s projektem Lombok“ byl původně publikován společností JavaWorld.