Lombok Builder med standardværdi

1. Introduktion

I denne hurtige vejledning undersøger vi, hvordan vi kan angive standardværdier for attributter, når vi bruger bygmønsteret med Lombok.

Sørg også for at tjekke vores introduktion til Lombok.

2. Afhængigheder

Vi bruger Lombok i denne vejledning, og til det har vi kun brug for en afhængighed:

 org.projectlombok lombok 1.18.10 leveret 

3. POJO med Lombok Builder

Lad os først se på, hvordan Lombok kan hjælpe os med at slippe af med den kedelpladekode, der er nødvendig for at implementere bygmønsteret.

Vi starter med en simpel POJO:

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

For at denne klasse skal være nyttig, har vi brug for getters. Hvis vi f.eks. Ønsker at bruge denne klasse med en ORM, har vi sandsynligvis brug for en standardkonstruktør.

Oven på disse ønsker vi en bygherre til denne klasse. Med Lombok kan vi få alt dette med nogle enkle kommentarer:

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

4. Definition af forventninger

Lad os definere nogle forventninger til, hvad vi ønsker at opnå i form af enhedstest.

Det første og grundlæggende krav er tilstedeværelsen af ​​standardværdier, efter at vi har bygget et objekt med en builder:

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

Selvfølgelig fejler denne test, siden @Bygger kommentar udfylder ikke værdier. Vi løser dette snart.

Hvis vi bruger en ORM, er det normalt afhængig af en standardkonstruktør. Så vi skal forvente den samme opførsel fra standardkonstruktøren, som vi gør fra bygherren:

@Test offentlig ugyldighed 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 tidspunkt består denne test.

Lad os nu se, hvordan vi kan få begge test bestået!

5. Lomboks Builder. Standard Kommentar

Siden Lombok v1.16.16 kan vi bruge @Bygger'S indre kommentar:

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

Det er simpelt og læsbart, men det har nogle mangler.

Med dette vil standardværdierne være til stede hos bygherren, hvilket får den første testsag til at bestå. Desværre får no-args-konstruktøren ikke standardværdierne, hvilket får den anden testtilfælde til at mislykkes. Selvom no-args-konstruktøren ikke genereres, men eksplicit er skrevet.

Denne bivirkning af Builder. Standard kommentar er til stede fra begyndelsen, og sandsynligvis vil den være hos os i lang tid.

6. Initialiser Builder

Vi kan forsøge at få begge tests til at passere ved at definere standardværdier i en minimalistisk builderimplementering:

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

På denne måde vil begge tests bestå.

Desværre er prisen duplikering af kode. For en POJO med snesevis af felter, kan det være forkert at opretholde den dobbelte initialisering.

Men hvis vi er villige til at betale denne pris, skal vi også tage os af en ting mere. Hvis vi omdøber vores klasse ved hjælp af en refactoring i vores IDE, omdøbes den statiske indre klasse ikke automatisk. Så finder Lombok det ikke, og vores kode går i stykker.

For at eliminere denne risiko kan vi dekorere bygherrens kommentar:

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

7. Brug toBuilder

@Bygger understøtter også generering af en instans af bygherren fra en forekomst af den oprindelige klasse. Denne funktion er ikke aktiveret som standard. Vi kan aktivere det ved at indstille toBuilder parameter i bygherrens kommentar:

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

Med dette, vi kan slippe af med den dobbelte initialisering.

Selvfølgelig er der en pris for det. Vi er nødt til at instantiere klassen for at oprette en bygherre. Så vi skal også ændre vores tests:

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

Igen går begge tests, så vi har den samme standardværdi ved hjælp af no-args-konstruktøren som ved brug af bygherren.

8. Konklusion

Så vi har set på flere muligheder for at give standardværdier til Lombok-bygherren.

Bivirkningen af Bygger.Standard kommentar er værd at holde øje med. Men de andre muligheder har også deres ulemper. Så vi er nødt til at vælge omhyggeligt ud fra den aktuelle situation.

Som altid er koden tilgængelig på GitHub.


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