Programmēšana

Kopēja Java objekta funkcionalitāte ar Project Lombok

Project Lombok ir neliela bibliotēka, kuru var izmantot, lai samazinātu Java klases katlu daudzumu, kas parasti tiek rakstīts Java klasēm. Project Lombok to dara, izmantojot anotācijas, kuras var pievienot Java klasei, kurai vēlamas kopīgas metodes. Lielākā daļa anotāciju ir aprakstoši pēc nosaukumiem: @Getter, @Setter, @EqualsAndHashCode, @ToString un @NoArgsConstructor ir piemēri. Šajā amatā es parādīju, kā tiek izmantotas vienkāršas Lombok anotācijas, lai pievienotu šīs parasti rakstītās metodes Java klasei.

Šeit ir vienkārša klase bez iepriekš definētas ignorētās toString () versijas.

bezString Person.java

iepakojums dustin.piemēri; / ** * Simple Person klase bez katla. * * @autors Dastins * / publiskā klase Persona {privātā virknes uzvārds; privāta virkne firstName; } 

Kad tiek ģenerēta iepriekš minētā klase un tiek izsaukta tās netieši mantotā (no Object) toString () metode, izvade izskatās tāda, kāda parādīta nākamajā attēlā.

Mēs varētu uzrakstīt skaidru toString () metodi vai izmantot Project Lombok. Nākamais koda fragments demonstrē pieeju Project Lombok.

Person.java ar Lombokas @ToString anotāciju

iepakojums dustin.piemēri; importēt lombok.ToString; / ** * Simple Person klase bez katla. * * @author Dustin * / @ToString public class Person {private String lastName; privāta virkne firstName; } 

Nākamais tiek parādīts rezultāts, kas rodas, izdrukājot šīs klases saturu, izmantojot Lombok nodrošinātu toString ().

Tagad objektam Person ir labāks toString () attēlojums, taču tā lauki joprojām netiek inicializēti, tāpēc mēs redzam tikai nulles vērtības. Mēs varam atkal izmantot Lombok, lai izveidotu konstruktoru.

Person.java ar Lombokas @AllArgsConstructor anotāciju

iepakojums dustin.piemēri; importa lombok.AllArgsConstructor; importēt lombok.ToString; / ** * Simple Person klase bez katla. * * @author Dustin * / @ToString @AllArgsConstructor public class Person {private String lastName; privāta virkne firstName; } 

Pēc objekta Persona momentānās es tagad varu (faktiski tas ir jādara) parametrus. Rezultāti tiek parādīti nākamajā ekrāna attēlā. Šajā gadījumā mans klienta kods (Main.java) parāda kompilēšanas laika kļūdu NetBeans, jo NetBeans netic, ka personā ir konstruktors, kurš pieņem divas virknes. Neskatoties uz sarkanajām izliektajām zīmēm, kods tiek veidots, kad es lūdzu NetBeans to izveidot.

Tāda klase kā Person.java bieži ir datu klase, kas būs jāizmanto salīdzinājumos un, iespējams, uz hashCode balstītās kolekcijas atslēgās. Ir svarīgi pareizi izveidot vienādu (Object) un hashCode () ieviešanu un pārliecināties, ka tie ir izveidoti kopā. Tā kā ir noklusējuma vienādas un hashCode metodes, ko nodrošina vecākā objektu klase, Java kods, izmantojot personas gadījumus, varēs izpildīt vienādus un / vai hashCode, taču visticamāk, ka tie nav īsti tie, ko vēlas. Kad Main izpildāmā klase tiek mainīta uz nākamo kodu sarakstu, mēs redzam izvadi pēc tā, kas mums saka, ka vienlīdzības salīdzinājums tiek veikts pilnībā, pamatojoties uz identitāti, nevis uz saturu.

Main.java, kas pārbauda vienādu ar () ieviešanu

iepakojums dustin.piemēri; importēt statisko java.lang.System.out; / ** * Vienkāršais galvenais, lai izmantotu Project Lombok darbināmas klases. * * @author Dustin * / public class Main {public static void main (final String [] argumenti) {// final Persona persona = jauna Persona (); galīgā persona = jaunā persona ("Miles", "Linda"); out.println (persona); galīgā virkne sameLastName = "Smits"; galīgā virkne sameFirstName = "Sam"; galīgā persona persona1 = jauna persona (tas patsLastName, sameFirstName); galīgā persona persona2 = jauna persona (tas patsLastName, sameFirstName); ja (persona1.vienāda (persona2)) {out.println ("Tā pati persona!"); } else {out.println ("Dažādi cilvēki!"); }}} 

To te gandrīz nekad nevēlas. Tā vietā ir nepieciešama vienāda vienāda ieviešana. Man patīk fakts, ka Lombokas anotācija par to, @EqualsAndHashCode, abus ģenerē tikai kopā, jo nav jēgas tos skaidri ignorēt atsevišķi. Person.java klases saraksts tiek parādīts nākamais, pievienojot @EqualsAndHashCode anotāciju.

Person.java ar @EqualsAndHashCode

iepakojums dustin.piemēri; importa lombok.AllArgsConstructor; importēt lombok.EqualsAndHashCode; importēt lombok.ToString; / ** * Simple Person klase bez katla. * * @author Dustin * / @ToString @AllArgsConstructor @EqualsAndHashCode public class Person {private String lastName; privāta virkne firstName; } 

Rezultāts tagad ir labāks.

Man joprojām nav labs veids, kā vajadzības gadījumā piekļūt katram publiskajam laukam atsevišķi. Piemēram, ja es gribēju kaut ko darīt savā kodā, pamatojoties uz uzvārdu, man nav labu iespēju to panākt, neveicot krasus soļus. Es šeit atkal varu izmantot Lombok.

Pieņemsim, ka šajā piemērā mēs pieļāvām kļūdainu pieņēmumu, ka var mainīties tikai personas uzvārds. Šī pieņēmuma dēļ mēs sniegsim tikai Lombok @Setter anotāciju uzvārdam, bet abiem laukiem - @Getter anotāciju. Nākamais tiek parādīts mainītais personas kods.

Person.java ar @Getter un @Setter

iepakojums dustin.piemēri; importa lombok.AllArgsConstructor; importēt lombok.EqualsAndHashCode; importa lombok.Getter; importa lombok.Setter; importēt lombok.ToString; / ** * Simple Person klase bez katla. * * @author Dustin * / @ToString @AllArgsConstructor @EqualsAndHashCode public class Person {@Getter @Setter private String lastName; @Getter private String firstName; } 

Lai izpildītu šo piemēru, ir atjaunināta galvenā klase:

Main.java, kas izmanto New Setter / Getter

iepakojums dustin.piemēri; importēt statisko java.lang.System.out; / ** * Vienkāršais galvenais, lai izmantotu Project Lombok darbināmas klases. * * @author Dustin * / public class Main {public static void main (final String [] argumenti) {// final Persona persona = jauna Persona (); galīgā persona = jaunā persona ("Miles", "Linda"); out.println (persona); galīgā virkne sameLastName = "Smits"; galīgā virkne sameFirstName = "Sam"; galīgā persona persona1 = jauna persona (tas patsLastName, sameFirstName); galīgā persona persona2 = jauna persona (tas patsLastName, sameFirstName); ja (persona1.vienāda (persona2)) {out.println ("Tā pati persona!"); } else {out.println ("Dažādi cilvēki!"); } final Persona pieejamaPerson = new Person ("Garzminski", "Gary"); out.println ("Uzvārds ir" + availablePerson.getLastName ()); out.println ("Vārds ir" + availablePerson.getFirstName ()); //pieejamsPerson.setFirstName("Grady "); pieejamsPerson.setLastName ("Garfunkel"); out.println ("Jaunais uzvārds ir" + availablePerson.getLastName ()); }} 

Man nācās komentēt aicinājumu noteikt personas vārdu tā, lai kods tiktu izveidots. Tagad tas darbojas, kā parādīts nākamajā ekrāna momentuzņēmumā.

Iespējams, ka šī Lombok anotāciju kolekcija būtu vēlama, it īpaši attiecībā uz datiem orientētām klasēm. Šī iemesla dēļ Project Lombok nodrošina apkopotas anotācijas, piemēram, @Data, kas nodrošina šo anotāciju kolekciju. Šajā gadījumā es varētu būt izturējies ļoti līdzīgi uz vairākām atsevišķām anotācijām, kuras es sniedzu, izmantojot @Data. Anotācija @Data noved pie tā, ka Lombok visiem laukiem piemēro @Getter un visiem laukiem, kas nav galīgie, @Setter. Otra galvenā atšķirība no tā, ko es izmantoju, ir tā, ka tā izmanto @RequiredArgsConstructor, nevis @AllArgsConstructor.

Viens no labākajiem veidiem, kā redzēt, ko Project Lombok ir izdarījis apkopotajam .class failam, ir javap izmantošana. Tas tiek parādīts nākamajā ekrāna momentuzņēmumā.

Šajā izvadē redzam, ka apkopotajā Person.class ir pieejama virkne metožu, kas parasti tiek uzskatīti par katla plāksnes kodu. Ir divu argumentu parametrizēts konstruktors hashCode (), vienāds ar (Object), toString () un paredzamās iegūšanas un iestatīšanas metodes.

Projekts Lombok nav bez bažām un ierobežojumiem. Daudzi no tiem ir formulēti atbildēs uz Hamleta D'Arsija rakstu Java bez katla plāksnes - projekts Lombok. Viens ierobežojums ir samazināts atbalsts IDE, izņemot Eclipse (lai gan ir pienācīgs NetBeans atbalsts un tiek atbalstīts javac). Bažas rada tas, ka citiem lietotājiem, kuri lieto un uztur kodu, ir jauna atkarība no Lombokas. Šīs bažas var nedaudz mazināt, izmantojot delomboku, kuru vajadzības gadījumā varētu izmantot būvniecības procesā.

Citi raksti un emuāra ziņas, kas aptver Project Lombok, ietver Project Lombok - Nekad vairs nerakstiet Java katlu kodu, Java bez katla - Project Lombok, Project Lombok: Bye Bye Boilerplate, Java Posse projekta Lombok intervija, Project Lombok: izbeidziet Java daudzveidību , Project Lombok - must must have in your Java Toolkit, Project Lombok: Interesanti pupiņu saīsnes ar anotāciju procesoru, Intervija: Reinjērs un Roels uz Lombok, Katla koda samazināšana ar Project Lombok, Ātra izstrāde ar Lombok, Lombok samazina jūsu Katla plāksnes kodu un Labāka alternatīva getters un seters.

Šo stāstu "Kopējā Java objekta funkcionalitāte ar Project Lombok" sākotnēji publicēja JavaWorld.

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