Uobičajena funkcionalnost Java objekta s projektom Lombok

Project Lombok je mala knjižnica koja se može koristiti za smanjenje količine osnovnog Java koda koji se obično piše za Java satove. Project Lombok to čini putem bilješki koje se mogu dodati u klasu Java za koju se žele uobičajene metode. Većina napomena su samoopisna u svojim imenima: primjeri su @Getter, @Setter, @EqualsAndHashCode, @ToString i @NoArgsConstructor. U ovom postu demonstriram kako primjenjujem jednostavne Lombok bilješke kako bih ove uobičajene metode dodao u Java klasu.

Evo jednostavne klase bez unaprijed definirane nadjačane verzije toString ().

toString -less Person.java

package dustin.examples; /** * Simple Person class without boilerplate. * * @author Dustin */ public class Person { private String lastName; private String firstName; } 

Kada se generira gornja klasa i pozove njena implicitno naslijeđena (od Object) toString () metoda, izlaz izgleda kao onaj prikazan na sljedećoj slici.

Mogli bismo napisati eksplicitnu metodu toString () ili koristiti Project Lombok. Sljedeći isječak koda pokazuje pristup Project Lombok.

Person.java s Lombokovom @ToString bilješkom

package dustin.examples; import lombok.ToString; /** * Simple Person class without boilerplate. * * @author Dustin */ @ToString public class Person { private String lastName; private String firstName; } 

Izlaz iz ispisa sadržaja ove klase pomoću toStringa () koji je osigurao Lombok prikazani su sljedeći.

Sada postoji bolji prikaz toString () objekta Person, ali njegova polja još uvijek nisu inicijalizirana, tako da vidimo samo null vrijednosti. Lombok možemo ponovno koristiti za stvaranje konstruktora.

Person.java s Lombokovom bilješkom @AllArgsConstructor

package dustin.examples; import lombok.AllArgsConstructor; import lombok.ToString; /** * Simple Person class without boilerplate. * * @author Dustin */ @ToString @AllArgsConstructor public class Person { private String lastName; private String firstName; } 

Sada mogu (zapravo moram) predati parametre nakon instanciranja objekta Person. Rezultati su prikazani na sljedećoj slici na ekranu. U ovom slučaju, moj klijentski kôd (Main.java) prikazuje pogrešku vremena kompajliranja u NetBeansu, jer NetBeans ne vjeruje da u Osobi postoji konstruktor koji prihvaća dva niza. Unatoč crvenim mršavim oznakama, kôd se gradi kad od NetBeansa zatražim da ga izgrade.

Klasa poput Person.java često je podatkovna klasa koja će se trebati koristiti u usporedbama i možda ključevima kolekcije na temelju hashCode. Važno je pravilno stvoriti implementacije jednakih (Object) i hashCode () i osigurati njihovo zajedničko stvaranje. Budući da postoje zadane metode equals i hashCode koje pruža roditeljska klasa Object, Java kôd pomoću instanci Person moći će izvoditi equals i / ili hashCode, ali vjerojatno neće biti ono što netko stvarno želi. Kada se glavna izvršna klasa promijeni u sljedeći popis koda, vidimo izlaz nakon toga koji nam govori da se usporedba jednakosti vrši u potpunosti na temelju identiteta, a ne na sadržaju.

Main.java To je ispitivanje jednako () Implementacija

package dustin.examples; import static java.lang.System.out; /** * Simple Main for uses Project Lombok-powered classes. * * @author Dustin */ public class Main { public static void main(final String[] arguments) { //final Person person = new Person(); final Person person = new Person("Miles", "Linda"); out.println(person); final String sameLastName = "Smith"; final String sameFirstName = "Sam"; final Person person1 = new Person(sameLastName, sameFirstName); final Person person2 = new Person(sameLastName, sameFirstName); if (person1.equals(person2)) { out.println("Same person!"); } else { out.println("Different people!"); } } } 

Ovdje se gotovo nikad ne želi to. Umjesto toga, potrebna je izričita jednaka provedba. Sviđa mi se činjenica da Lombok napomena za ovo, @EqualsAndHashCode, generira obje zajedno, jer nema smisla eksplicitno ih nadjačati pojedinačno. Sljedeći je prikazan popis klase Person.java s dodatkom napomene @EqualsAndHashCode.

Person.java s @EqualsAndHashCode

package dustin.examples; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.ToString; /** * Simple Person class without boilerplate. * * @author Dustin */ @ToString @AllArgsConstructor @EqualsAndHashCode public class Person { private String lastName; private String firstName; } 

Sada je izlaz bolji.

Još uvijek nemam dobar način za pristup svakom javnom polju posebno ako je potrebno. Na primjer, ako sam želio učiniti nešto u svom kodu na temelju prezimena, nemam dobar način da to postignem bez drastičnih koraka. Ovdje mogu ponovno koristiti Lombok.

U ovom ćemo primjeru pretpostaviti da smo pogrešno pretpostavili da bi se moglo promijeniti samo prezime te osobe. Zbog ove pretpostavke pružit ćemo samo bilješku Lombok @Setter za prezime, ali uz napomenu @Getter za oba polja. Sljedeći je prikazan promijenjeni kod osobe.

Person.java s @Getter i @Setter

package dustin.examples; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import lombok.ToString; /** * Simple Person class without boilerplate. * * @author Dustin */ @ToString @AllArgsConstructor @EqualsAndHashCode public class Person { @Getter @Setter private String lastName; @Getter private String firstName; } 

Evo ažurirane glavne klase za pokretanje ovog primjera:

Main.java koja koristi novi setter / getter

package dustin.examples; import static java.lang.System.out; /** * Simple Main for uses Project Lombok-powered classes. * * @author Dustin */ public class Main { public static void main(final String[] arguments) { //final Person person = new Person(); final Person person = new Person("Miles", "Linda"); out.println(person); final String sameLastName = "Smith"; final String sameFirstName = "Sam"; final Person person1 = new Person(sameLastName, sameFirstName); final Person person2 = new Person(sameLastName, sameFirstName); if (person1.equals(person2)) { out.println("Same person!"); } else { out.println("Different people!"); } final Person accessiblePerson = new Person("Garzminski", "Gary"); out.println("The last name is " + accessiblePerson.getLastName()); out.println("The first name is " + accessiblePerson.getFirstName()); //accessiblePerson.setFirstName("Grady"); accessiblePerson.setLastName("Garfunkel"); out.println("The new last name is " + accessiblePerson.getLastName()); } } 

Morao sam komentirati poziv kako bih postavio ime osobe tako da se kôd gradi. Sada se izvodi kako je prikazano na sljedećem snimku zaslona.

Vjerojatno je da bi ova zbirka Lombokovih bilješki bila uobičajeno poželjna, posebno za klase orijentirane na podatke. Iz tog razloga, Project Lombok nudi agregirane bilješke poput @Data koje pružaju zbirku tih bilješki. U ovom bih slučaju mogao dobiti vrlo slično ponašanje kao nekoliko pojedinačnih bilješki koje sam pružio pomoću @Data. Napomena @Data dovodi do toga da Lombok primijeni @Getter na sva polja, a @Setter na sva ne-konačna polja. Druga glavna razlika od onoga što sam koristio je to što koristi @RequiredArgsConstructor, a ne @AllArgsConstructor.

Jedan od najboljih načina da se vidi što je Project Lombok učinio sa sastavljenom .class datotekom je upotreba javapa. To je prikazano na sljedećem snimku zaslona.

U ovom izlazu vidimo da je hrpa metoda koje se često vide kao šifra uzorka dostupna u kompiliranom razredu Person.class. Postoji parametar parametarski konstruktor s dva argumenta, hashCode (), equals (Object), toString () i očekivane metode get i set.

Projekt Lombok nije bez briga i ograničenja. Mnogi od njih artikulirani su u odgovorima na post Hamleta D'Arcyja "Java bez bojlera" - projekt Lombok. Jedno ograničenje je smanjena podrška u IDE-ima koji nisu Eclipse (iako postoji pristojna podrška za NetBeans i podržan je javac). Zabrinjava potreba da drugi koji koriste i održavaju kôd imaju novu ovisnost o Lomboku. Ova se zabrinutost može donekle ublažiti upotrebom djeloboka, koji bi se mogao koristiti u procesu izrade ako je potrebno.

Ostali članci i postovi na blogu koji pokrivaju Project Lombok uključuju Project Lombok - nikad više ne pišite Java kôd tablice, Java bez bojler ploče - Project Lombok, Project Lombok: Bye Bye Boilerplate, intervju tvrtke Java Posse s projektom Lombok, Project Lombok: Stavite kraj Java verbosityu , Projekt Lombok - što morate imati u svom Java alatu, Projekt Lombok: Zanimljivi prečaci do graha s procesorom bilješki, Intervju: Reinier i Roel na Lomboku, Smanjenje koda bojlera s projektom Lombok, Brzi razvoj s Lombokom, Lombok smanjuje vaš kôd tablice i Bolja alternativa za getere i setere.

Ovu je priču "Zajednička funkcionalnost Java objekta s projektom Lombok" izvorno objavio JavaWorld.