Lombok Builder med standardverdi

1. Introduksjon

I denne raske opplæringen vil vi undersøke hvordan vi kan gi standardverdier for attributter når vi bruker byggemønsteret med Lombok.

Husk å sjekke ut introduksjonen vår til Lombok også.

2. Avhengigheter

Vi bruker Lombok i denne opplæringen, og til det trenger vi bare en avhengighet:

 org.projectlombok lombok 1.18.10 gitt 

3. POJO With Lombok Builder

La oss først ta en titt på hvordan Lombok kan hjelpe oss med å bli kvitt kjeleplatekoden som trengs for å implementere byggemønsteret.

Vi starter med en enkel POJO:

offentlig klasse Pojo {privat strengnavn; privat boolsk original; }

For at denne klassen skal være nyttig, trenger vi getters. Hvis vi for eksempel vil bruke denne klassen med en ORM, trenger vi sannsynligvis en standardkonstruktør.

På toppen av disse ønsker vi en byggherre for denne klassen. Med Lombok kan vi få alt dette med noen enkle merknader:

@Getter @Builder @NoArgsConstructor @AllArgsConstructor offentlig klasse Pojo {privat strengnavn; privat boolsk original; }

4. Definere forventninger

La oss definere noen forventninger til hva vi ønsker å oppnå i form av enhetstester.

Det første og grunnleggende kravet er tilstedeværelsen av standardverdier etter at vi bygger et objekt med en byggherre:

@Test offentlig ugyldig givenBuilderWithDefaultValue_ThanDefaultValueIsPresent () {Pojo build = Pojo.builder () .build (); Assert.assertEquals ("foo", build.getName ()); Assert.assertTrue (build.isOriginal ()); }

Selvfølgelig mislykkes denne testen siden @Bygger merknader fyller ikke verdier. Vi fikser dette snart.

Hvis vi bruker en ORM, er det vanligvis avhengig av en standardkonstruktør. Så vi bør forvente samme oppførsel fra standardkonstruktøren som vi gjør fra byggherren:

@Test offentlig ugyldig givenBuilderWithDefaultValue_NoArgsWorksAlso () {Pojo build = Pojo.builder () .build (); Pojo pojo = ny Pojo (); Assert.assertEquals (build.getName (), pojo.getName ()); Assert.assertTrue (build.isOriginal () == pojo.isOriginal ()); }

På dette stadiet består denne testen.

La oss nå se hvordan vi kan få begge testene til å bestå!

5. Lomboks Builder. Standard Kommentar

Siden Lombok v1.16.16 kan vi bruke @Bygger‘S indre kommentar:

// klassekommentarer som før offentlig klasse Pojo {@ Builder.Default privat strengnavn = "foo"; @ Builder.Default privat boolsk original = sann; }

Det er enkelt og lesbart, men det har noen feil.

Med dette vil standardverdiene være tilstede med byggherren, noe som får den første testsaken til å bestå. Dessverre vil ikke-args-konstruktøren ikke få standardverdiene, noe som gjør at den andre testsaken mislykkes. Selv om ikke-args-konstruktøren ikke er generert, men eksplisitt skrevet.

Denne bivirkningen av Builder. Standard merknader er til stede fra begynnelsen, og sannsynligvis vil det være med oss ​​i lang tid.

6. Initialiser byggmesteren

Vi kan prøve å få begge testene til å bestå ved å definere standardverdier i en minimalistisk byggherreimplementering:

// klassekommentarer som før offentlig klasse Pojo {privat strengnavn = "foo"; privat boolsk original = sann; offentlig statisk klasse PojoBuilder {private String name = "foo"; privat boolsk original = sann; }}

På denne måten vil begge testene bestå.

Dessverre er prisen duplisering av kode. For en POJO med titalls felt, kan det være feil utsatt for å opprettholde den doble initialiseringen.

Men hvis vi er villige til å betale denne prisen, bør vi ta oss av en ting til. Hvis vi omdøper klassen vår ved hjelp av en refactoring i IDEen vår, blir ikke den statiske indre klassen automatisk omdøpt. Da finner Lombok den ikke, og koden vår går i stykker.

For å eliminere denne risikoen kan vi dekorere byggherrens kommentar:

// klassekommentarer som før @Builder (builderClassName = "PojoBuilder") offentlig klasse Pojo {private String name = "foo"; privat boolsk original = sann; offentlig statisk klasse PojoBuilder {private String name = "foo"; privat boolsk original = sann; }}

7. Bruke toBuilder

@Bygger støtter også å generere en forekomst av byggherren fra en forekomst av den opprinnelige klassen. Denne funksjonen er ikke aktivert som standard. Vi kan aktivere det ved å stille inn toBuilder parameter i byggherrekommentar:

// klassekommentarer som før @Builder (toBuilder = true) offentlig klasse Pojo {private String name = "foo"; privat boolsk original = sann; }

Med dette, vi kan bli kvitt den doble initialiseringen.

Det er selvfølgelig en pris for det. Vi må sette kursen i gang for å lage en byggmester. Så vi må også endre testene våre:

@Test offentlig ugyldig givenBuilderWithDefaultValue_ThenDefaultValueIsPresent () {Pojo build = new Pojo (). ToBuilder () .build (); Assert.assertEquals ("foo", build.getName ()); Assert.assertTrue (build.isOriginal ()); } @Test offentlig ugyldig givenBuilderWithDefaultValue_thenNoArgsWorksAlso () {Pojo build = new Pojo (). ToBuilder () .build (); Pojo pojo = ny Pojo (); Assert.assertEquals (build.getName (), pojo.getName ()); Assert.assertTrue (build.isOriginal () == pojo.isOriginal ()); }

Igjen, begge testene består, så vi har samme standardverdi ved hjelp av no-args-konstruktøren som når du bruker byggmesteren.

8. Konklusjon

Så vi har sett på flere alternativer for å gi standardverdier for Lombok-byggherren.

Bivirkningen av Bygger.Misligholde kommentar er verdt å holde øye med. Men de andre alternativene har også sine ulemper. Så vi må velge nøye ut fra dagens situasjon.

Som alltid er koden tilgjengelig på GitHub.


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