Programavimas

Bendra „Java“ objekto funkcionalumas naudojant „Project Lombok“

„Project Lombok“ yra maža biblioteka, kuri gali būti naudojama norint sumažinti „Java“ kodo, kuris paprastai rašomas „Java“ klasėms, kiekį. „Project Lombok“ tai daro per anotacijas, kurias galima pridėti prie „Java“ klasės, kuriai reikalingi bendri metodai. Daugelis anotacijų apibūdina savo vardus: pavyzdžiai yra @Getter, @Setter, @EqualsAndHashCode, @ToString ir @NoArgsConstructor. Šiame įraše aš parodysiu, kaip taikyti paprastas „Lombok“ anotacijas, kad šie dažniausiai parašyti metodai būtų įtraukti į „Java“ klasę.

Čia yra paprasta klasė be iš anksto apibrėžtos nepaisomos toString () versijos.

beStringinis asmuo.java

pakuotė dustin.pavyzdžiai; / ** * „Simple Person“ klasė be katilo. * * @author Dustin * / viešosios klasės asmuo {private String lastName; privati ​​eilutė firstName; } 

Kai sukuriama aukščiau paminėta klasė ir iškviečiamas jos netiesiogiai paveldėtas (iš Object) toString () metodas, išvestis atrodo taip, kaip parodyta kitame paveikslėlyje.

Galėtume parašyti aiškų toString () metodą arba naudoti „Project Lombok“. Kitas kodo fragmentas rodo „Project Lombok“ požiūrį.

Person.java su Lomboko @ToString anotacija

pakuotė dustin.pavyzdžiai; importuoti lombok.ToString; / ** * „Simple Person“ klasė be katilo. * * @author Dustin * / @ToString viešosios klasės asmuo {private String lastName; privati ​​eilutė firstName; } 

Rezultatas, atspausdinus šios klasės turinį naudojant „Lombok“ pateiktą „toString“ (), rodomas toliau.

Dabar yra geresnis objekto Asmuo atvaizdavimas toString (), tačiau jo laukai vis dar nėra inicializuoti, todėl matome tik nulines reikšmes. Konstruktoriui sukurti galime vėl naudoti „Lombok“.

Person.java su „Lombok“ @AllArgsConstructor anotacija

pakuotė dustin.pavyzdžiai; importuoti „lombok.AllArgsConstructor“; importuoti lombok.ToString; / ** * „Simple Person“ klasė be katilo. * * @author Dustin * / @ToString @AllArgsConstructor viešosios klasės asmuo {private String lastName; privati ​​eilutė firstName; } 

Dabar aš galiu (tiesą sakant, privalau) perduoti parametrus, atlikus objekto Asmuo momentą. Rezultatai rodomi kitame ekrano vaizde. Šiuo atveju mano kliento kodas (Main.java) rodo „NetBeans“ kompiliavimo laiko klaidą, nes „NetBeans“ nemano, kad asmenyje yra konstruktorius, priimantis dvi eilutes. Nepaisant raudonų sklandžių žymių, kodas sukuriamas, kai paprašau „NetBeans“ jį sukurti.

Tokia klasė kaip Person.java dažnai yra duomenų klasė, kurią reikės naudoti palyginant ir galbūt „hashCode“ pagrįstus rinkimo raktus. Svarbu teisingai sukurti lygių (Object) ir hashCode () diegimus ir įsitikinti, kad jie sukurti kartu. Kadangi yra numatytieji lygūs ir „hashCode“ metodai, kuriuos teikia pagrindinė „Object“ klasė, „Java“ kodas, naudodamas Asmens egzempliorius, galės atlikti lygų ir (arba) „hashCode“, tačiau greičiausiai jie nebus tokie, kokių iš tikrųjų norisi. Kai pagrindinė vykdomųjų klasė pakeičiama į kitą kodų sąrašą, po to matome išvestį, kuri mums sako, kad lygybės palyginimas atliekamas visiškai remiantis tapatybe, o ne turiniu.

Main.java Kad bandymai yra lygūs () įgyvendinimas

pakuotė dustin.pavyzdžiai; importuoti statinį java.lang.System.out; / ** * Paprastas pagrindinis „Project Lombok“ varomų klasių naudojimas. * * @author Dustin * / public class Pagrindinis {public static void main (final String [] argumentai) {// galutinis Asmuo asmuo = naujas Asmuo (); galutinis asmuo = naujas asmuo („Miles“, „Linda“); out.println (asmuo); final String sameLastName = "Smithas"; final String sameFirstName = "Sam"; galutinis asmens asmuo1 = naujas asmuo (tas patsPavardė, tas patsVardas); galutinis asmens asmuo2 = naujas asmuo (tas patsPavardė, tas patsVardas); if (asmuo1.lygus (asmuo2)) {out.println ("Tas pats asmuo!"); } else {out.println ("Skirtingi žmonės!"); }}} 

Čia beveik niekada nėra to, ko norima. Vietoj to reikalingas aiškus lygus įgyvendinimas. Man patinka tai, kad „Lombok“ anotacija apie tai, „EqualsAndHashCode“, generuoja abu šiuos elementus tik kartu, nes nėra prasmės jų aiškiai nepaisyti atskirai. „Person.java“ klasės sąrašas rodomas šalia pridėjus @EqualsAndHashCode anotaciją.

Person.java su @EqualsAndHashCode

pakuotė dustin.pavyzdžiai; importuoti „lombok.AllArgsConstructor“; importuoti „lombok.EqualsAndHashCode“; importuoti lombok.ToString; / ** * „Simple Person“ klasė be katilo. * * @author Dustin * / @ToString @AllArgsConstructor @EqualsAndHashCode public class Person {private String lastName; privati ​​eilutė firstName; } 

Dabar išvestis geresnė.

Aš vis dar neturiu gero būdo, jei reikia, prieiti prie kiekvieno viešojo lauko atskirai. Pavyzdžiui, jei norėjau ką nors padaryti savo kode pagal pavardę, neturiu gero būdo tai pasiekti nesiimdamas drastiškų žingsnių. Čia vėl galiu naudoti „Lombok“.

Šiame pavyzdyje manysime, kad padarėme klaidingą prielaidą, kad gali pasikeisti tik asmens pavardė. Dėl šios prielaidos pateiksime tik „Lombok @Setter“ anotaciją apie pavardę, bet pateiksime „@Getter“ anotaciją abiem laukams. Pakeistas asmens kodas rodomas toliau.

Person.java su @Getter ir @Setter

pakuotė dustin.pavyzdžiai; importuoti „lombok.AllArgsConstructor“; importuoti „lombok.EqualsAndHashCode“; importuoti lombok.Getter; importuoti lomboką.Seteris; importuoti lombok.ToString; / ** * „Simple Person“ klasė be katilo. * * @author Dustin * / @ToString @AllArgsConstructor @EqualsAndHashCode public class Person {@Getter @Setter private String lastName; @Getter private String firstName; } 

Čia yra atnaujinta Pagrindinė klasė, kad būtų rodomas šis pavyzdys:

„Main.java“, kuri naudojasi naujuoju seteriu / „Getter“

pakuotė dustin.pavyzdžiai; importuoti statinį java.lang.System.out; / ** * Paprastas pagrindinis „Project Lombok“ varomų klasių naudojimas. * * @author Dustin * / public class Pagrindinis {public static void main (final String [] argumentai) {// galutinis Asmuo asmuo = naujas Asmuo (); galutinis asmuo = naujas asmuo („Miles“, „Linda“); out.println (asmuo); galutinė eilutė sameLastName = "Smith"; final String sameFirstName = "Sam"; galutinis asmens asmuo1 = naujas asmuo (tas patsPavardė, tas patsVardas); galutinis asmens asmuo2 = naujas asmuo (tas patsPaskutinisVardas, tas patsVardas); if (asmuo1.lygus (asmuo2)) {out.println ("Tas pats asmuo!"); } else {out.println ("Skirtingi žmonės!"); } galutinis asmuo prieinamasPerson = naujas asmuo ("Garzminski", "Gary"); out.println ("Pavardė yra" + prieinamasPerson.getLastName ()); out.println ("Vardas yra" + prieinamasPerson.getFirstName ()); //accessiblePerson.setFirstName("Grady "); prieinamasPerson.setLastName („Garfunkel“); out.println ("Nauja pavardė yra" + prieinamasPerson.getLastName ()); }} 

Turėjau pakomentuoti raginimą nustatyti asmens vardą, kad kodas būtų sukurtas. Dabar jis veikia taip, kaip parodyta kitame ekrano momentiniame vaizde.

Tikėtina, kad šio „Lombok“ anotacijų rinkinio paprastai norėtųsi, ypač į duomenis orientuotoms klasėms. Dėl šios priežasties „Project Lombok“ pateikia apibendrintas anotacijas, tokias kaip @Data, kurios teikia šių anotacijų rinkinį. Šiuo atveju galėjau elgtis labai panašiai kaip kelios atskiros anotacijos, kurias pateikiau naudodamas „@Data“. „@Data“ anotacija lemia, kad „Lombok“ visuose laukuose taiko „@Getter“, o visuose ne galutiniuose - „@Setter“. Kitas pagrindinis skirtumas nuo to, ką naudojau, yra tai, kad jis naudoja @RequiredArgsConstructor, o ne @AllArgsConstructor.

Vienas iš geriausių būdų sužinoti, ką „Project Lombok“ padarė sukompiliuotam .class failui, yra „javap“ naudojimas. Tai parodyta kitoje ekrano nuotraukoje.

Šioje išvestyje matome, kad surinktame „Person.class“ yra daugybė metodų, kuriuos paprastai mato katilinės kodas. Yra dviejų argumentų parametruojamas konstruktorius hashCode (), lygus (Object), toString () ir numatomi gauti bei nustatyti metodai.

Projektas „Lombok“ nėra be rūpesčių ir apribojimų. Daugelis jų yra išdėstyti atsakymuose į Hamleto D'Arcy įrašą „Java without the Boilerplate - Project Lombok“. Vienas apribojimas yra sumažėjęs palaikymas IDE, išskyrus „Eclipse“ (nors yra tinkamas „NetBeans“ palaikymas ir palaikomas „javac“). Susirūpinimas yra būtinybė kitiems, naudojantiems ir palaikantiems kodą, turėti naują priklausomybę nuo „Lombok“. Šį susirūpinimą galima šiek tiek sušvelninti naudojant delombok, kuris prireikus galėtų būti naudojamas kuriant procesą.

Kiti straipsniai ir tinklaraščio įrašai, apimantys „Project Lombok“, yra „Project Lombok“ - niekada daugiau nerašykite „Java“ kaitinimo lentos kodo, „Java be katilo“ - „Project Lombok“, „Project Lombok: Bye Bye Boilerplate“, „Java Posse“ projekto „Lombok“ interviu, „Project Lombok“: nutraukite „Java“ daugialypiškumą , „Project Lombok“ - būtinas „Java“ įrankių rinkinys, „Project Lombok“: įdomios pupelių nuorodos su anotacijų procesoriumi, interviu: Reinier ir Roel apie „Lombok“, „Boilerplate Code“ sumažinimas naudojant „Project Lombok“, „Rapid Development“ su „Lombok“, „Lombok“ sumažina jūsų katilo kodą ir Geresnė alternatyva „Getters“ ir „Setters“.

Šią istoriją „Bendra„ Java “objekto funkcionalumas naudojant„ Project Lombok ““ iš pradžių paskelbė „JavaWorld“.