Programiranje

Skupna funkcionalnost predmeta Java v projektu Lombok

Project Lombok je majhna knjižnica, s katero lahko zmanjšamo količino osnovne kode Java, ki je običajno napisana za razrede Java. Project Lombok to počne s pripisi, ki jih je mogoče dodati v razred Java, za katerega so zaželene običajne metode. Večina pripisov je samoopisnih v svojih imenih: @Getter, @Setter, @EqualsAndHashCode, @ToString in @NoArgsConstructor so primeri. V tem prispevku dokazujem, kako uporabljam preproste pripombe Lombok, da te pogosto napisane metode dodam v razred Java.

Tu je preprost razred brez vnaprej določene razveljavljene različice toString ().

toString-manj oseba.java

paket prah v.primeri; / ** * Preprost razred osebe brez vzorca. * * @author Dustin * / javni razred Oseba {private String lastName; private String firstName; } 

Ko se zgornji razred generira in pokliče njegovo implicitno podedovano (od Object) toString (), je rezultat videti kot prikazan na naslednji sliki.

Lahko bi napisali eksplicitno metodo toString () ali uporabili Project Lombok. Naslednji delček kode prikazuje pristop k projektu Lombok.

Person.java z Lombokovim zapisom @ToString

paket prah v.primeri; uvoz lombok.ToString; / ** * Preprost razred osebe brez vzorca. * * @author Dustin * / @ToString javni razred Oseba {private String lastName; private String firstName; } 

Izhod iz tiskanja vsebine tega razreda s pomočjo Lombok-a toString () je prikazan naslednji.

Zdaj obstaja boljša predstavitev predmeta Person toString (), vendar njegova polja še vedno niso inicializirana, zato vidimo samo ničelne vrednosti. Za izdelavo konstruktorja lahko znova uporabimo Lombok.

Person.java z Lombokovim komentarjem @AllArgsConstructor

paket prah v.primeri; uvoz lombok.AllArgsConstructor; uvoz lombok.ToString; / ** * Preprost razred osebe brez vzorca. * * @author Dustin * / @ToString @AllArgsConstructor javni razred Oseba {private String lastName; private String firstName; } 

Zdaj lahko (dejansko moram) predati parametre ob instantaciji predmeta Person. Rezultati so prikazani na naslednji sliki zaslona. V tem primeru moja odjemalska koda (Main.java) prikazuje napako časa prevajanja v NetBeansu, ker NetBeans ne verjame, da je v osebi konstruktor, ki sprejema dva niza. Kljub rdečim mehkim oznakam se koda sestavi, ko jo prosim NetBeans.

Razred, kot je Person.java, je pogosto podatkovni razred, ki ga bo treba uporabiti za primerjavo in po možnosti ključe zbirke, ki temeljijo na hashCode. Pomembno je pravilno ustvariti enaki izvedbi (Object) in hashCode () ter zagotoviti, da sta ustvarjeni skupaj. Ker obstajajo privzete metode enakovrednosti in hashCode, ki jih zagotavlja nadrejeni razred predmeta, bo koda Java z uporabo primerkov Person lahko izvedla enakovrednike in / ali hashCode, vendar verjetno ne bodo tisto, kar si v resnici želi. Ko se glavni izvršljivi razred spremeni v naslednji seznam kod, vidimo izhod za tem, ki nam pove, da primerjava enakosti poteka v celoti na podlagi identitete in ne na vsebini.

Main.java, ki je enaka () Izvedba

paket prah v.primeri; uvoz statičnega java.lang.System.out; / ** * Simple Main za uporabo razredov s projektom Lombok. * * @author Dustin * / javni razred Main {public static void main (final String [] argument)) {// final Person person = new Person (); končna oseba oseba = nova oseba ("milje", "Linda"); out.println (oseba); končni niz sameLastName = "Smith"; končni niz sameFirstName = "Sam"; končna oseba person1 = nova oseba (istoLastName, sameFirstName); končna oseba person2 = nova oseba (sameLastName, sameFirstName); if (person1.equals (person2)) {out.println ("Ista oseba!"); } else {out.println ("Različni ljudje!"); }}} 

Tu se skoraj nikoli ne želi to. Namesto tega je potrebna izrecna enaka izvedba. Všeč mi je, da pripomba Lombok za to, @EqualsAndHashCode, ustvari le obe skupaj, ker jih ni smiselno izrecno preglasiti. Seznam razredov Person.java je naslednji prikazan z dodatkom pripisa @EqualsAndHashCode.

Person.java z @EqualsAndHashCode

paket prah v.primeri; uvoz lombok.AllArgsConstructor; uvoz lombok.EqualsAndHashCode; uvoz lombok.ToString; / ** * Preprost razred osebe brez vzorca. * * @author Dustin * / @ToString @AllArgsConstructor @EqualsAndHashCode javni razred Oseba {private String lastName; private String firstName; } 

Izhod je zdaj boljši.

Še vedno nimam dobrega načina za dostop do vsakega javnega polja posebej, če je to potrebno. Če bi na primer želel kaj narediti v svoji kodi na podlagi priimka, nimam dobrega načina, da bi to dosegel, ne da bi naredil drastične korake. Tu lahko spet uporabim Lombok.

Za ta primer bomo domnevali, da smo napačno domnevali, da se lahko spremeni samo priimek osebe. Zaradi te predpostavke bomo navedli le pripis Lombok @Setter za priimek, za oba polja pa pripis @Getter. Spremenjena koda osebe je prikazana naprej.

Person.java z @Getter in @Setter

paket prah v.primeri; uvoz lombok.AllArgsConstructor; uvoz lombok.EqualsAndHashCode; uvoz lombok.Getter; uvoz lombok.Setter; uvoz lombok.ToString; / ** * Preprost razred osebe brez vzorca. * * @author Dustin * / @ToString @AllArgsConstructor @EqualsAndHashCode javni razred Oseba {@Getter @Setter private String lastName; @ Pridobite zasebni niz firstName; } 

Tu je posodobljeni glavni razred za zagon tega primera:

Main.java, ki uporablja New Setter / Getter

paket prah v.primeri; uvoz statičnega java.lang.System.out; / ** * Simple Main za uporabo razredov s projektom Lombok. * * @author Dustin * / javni razred Main {public static void main (final String [] argument)) {// final Person person = new Person (); končna oseba oseba = nova oseba ("milje", "Linda"); out.println (oseba); končni niz sameLastName = "Smith"; končni niz sameFirstName = "Sam"; končna oseba person1 = nova oseba (istoLastName, sameFirstName); končna oseba person2 = nova oseba (sameLastName, sameFirstName); if (person1.equals (person2)) {out.println ("Ista oseba!"); } else {out.println ("Različni ljudje!"); } končna oseba dostopna oseba = nova oseba ("Garzminski", "Gary"); out.println ("Priimek je" + accessPerson.getLastName ()); out.println ("Ime je" + accessPerson.getFirstName ()); //accessiblePerson.setFirstName("Grady "); accessPerson.setLastName ("Garfunkel"); out.println ("Novo priimek je" + accessPerson.getLastName ()); }} 

Moral sem komentirati klic in določiti ime osebe, tako da bo koda nastajala. Zdaj se izvaja, kot je prikazano na naslednjem posnetku zaslona.

Verjetno je, da bi bila ta zbirka pripisov Lombok običajno zaželena, zlasti za podatke usmerjene razrede. Iz tega razloga Project Lombok ponuja združene pripise, kot je @Data, ki zagotavljajo zbirko teh pripisov. V tem primeru bi lahko dobil zelo podobno vedenje kot več posameznih pripisov, ki sem jih zagotovil z uporabo @Data. Pripis @Data vodi do tega, da Lombok uporabi @Getter za vsa polja in @Setter za vsa nekončna polja. Druga glavna razlika od tega, kar sem uporabil, je ta, da uporablja @RequiredArgsConstructor in ne @AllArgsConstructor.

Eden najboljših načinov, kako ugotoviti, kaj je Project Lombok storil s prevedeno datoteko .class, je uporaba javapa. To je prikazano na naslednjem posnetku zaslona.

V tem izidu vidimo, da je v sestavljenem razredu Person.class na voljo kopica metod, ki jih pogosto vidimo kot vzorčna koda. Obstaja dvoargumentirani parametrizirani konstruktor, hashCode (), equals (Object), toString () in pričakovane metode get in set.

Projekt Lombok ni brez pomislekov in omejitev. Mnogi od njih so artikulirani v odzivih na prispevek Hamleta D'Arcyja Java brez bojlerja - projekt Lombok. Ena omejitev je zmanjšana podpora v IDE, ki ni Eclipse (čeprav obstaja dostojna podpora za NetBeans in podprt je javac). Zaskrbljujoča je potreba, da imajo drugi, ki uporabljajo in vzdržujejo kodo, novo odvisnost od Lomboka. To skrb je mogoče nekoliko omiliti z uporabo deloboka, ki bi ga po potrebi uporabili v postopku izdelave.

Drugi članki in objave v blogu, ki zajemajo projekt Lombok, vključujejo projekt Lombok - Nikoli več ne piši kode Java Boilerplate, Java brez bojlerja - Project Lombok, Project Lombok: Adijo adijo, intervju s projektom Lombok Java Posse, projekt Lombok: konec jabolčnosti Java , Project Lombok - Must-Have in Your Java Toolkit, Project Lombok: Zanimive bližnjice do fižola s procesorjem zapiskov, Intervju: Reinier in Roel na Lomboku, Zmanjševanje kode kotlička s projektom Lombok, Hitri razvoj z Lombokom, Lombok zmanjšuje vašo kodo in Boljša alternativa za pridobivalce in seterje.

To zgodbo z naslovom "Skupna funkcionalnost objekta Java v projektu Lombok" je prvotno objavil JavaWorld.

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