Introduksjon til uforanderlige ting

1. Introduksjon

I denne artikkelen vil vi vise hvordan du kan arbeide med Immutables-biblioteket.

Biblioteket består av merknader og merkeprosessorer for å generere og arbeide med serieiserbare og tilpassbare uforanderlige objekter.

2. Maven-avhengigheter

For å kunne bruke Immutables i prosjektet ditt, må du legge til følgende avhengighet til avhengigheter delen av din pom.xml fil:

 org.immutables verdi 2.2.10 gitt 

Ettersom denne gjenstanden ikke er nødvendig i løpet av kjøretiden, er det tilrådelig å spesifisere sørget for omfang.

Den nyeste versjonen av biblioteket finner du her.

3. Uforanderlige

Biblioteket genererer uforanderlige gjenstander fra abstrakte typer: Grensesnitt, Klasse, Kommentar.

Nøkkelen til å oppnå dette er riktig bruk av @ Verdi. Uformelig kommentar. Den genererer en uforanderlig versjon av en kommentert type og prefikser navnet sitt med Uforanderlig nøkkelord.

Hvis vi prøver å generere en uforanderlig versjon av klassen som heter “X“, Det vil generere en klasse som heter “ImmutableX”. Genererte klasser er ikke rekursivt uforanderlige, så det er godt å huske på det.

Og et raskt notat - fordi Immutables bruker behandling av merknader, må du huske å aktivere behandling av merknader i IDE.

3.1. Ved hjelp av @ Verdi. Uformelig Med Abstrakte klasser og Grensesnitt

La oss lage en enkel abstrakt klasse Person bestående av to abstrakt tilgangsmetoder som representerer feltene som skal genereres, og kommenterer deretter klassen med @ Verdi. Uformelig kommentar:

@ Value.Immutable public abstract class Person {abstract String getName (); abstrakt Heltall getAge (); }

Etter at behandlingen av merknader er gjort, kan vi finne en klar til bruk, nylig generert Uforanderlig person klasse i en mål / genererte kilder katalog:

@Generated ({"Immutables.generator", "Person"}) offentlig sluttklasse ImmutablePerson utvider Person {private final Strengnavn; privat slutt Heltalder; private ImmutablePerson (String name, Integer age) {this.name = name; this.age = alder; } @ Override String getName () {returnavn; } @ Override Integer getAge () {retur alder; } // toString, hashcode, er lik, copyOf og Builder utelatt}

Den genererte klassen kommer med implementert toString, hashcode, er lik metoder og med en trinnbygger ImmutablePerson.Builder. Legg merke til at den genererte konstruktøren har privat adgang.

For å konstruere en forekomst av Uforanderlig person klasse, må vi bruke byggmester eller statisk metode ImmutablePerson.copyOf, som kan skape en Uforanderlig person kopi fra en Person gjenstand.

Hvis vi ønsker å konstruere en forekomst ved hjelp av byggherren, kan vi bare kode:

ImmutablePerson john = ImmutablePerson.builder () .age (42) .name ("John") .build ();

Genererte klasser er uforanderlige, noe som betyr at de ikke kan endres. Hvis du vil endre et allerede eksisterende objekt, kan du bruke et av “withX”-Metoder, som ikke endrer et originalt objekt, men oppretter en ny forekomst med et modifisert felt.

La oss oppdatere john's alder og skape et nytt john43 gjenstand:

ImmutablePerson john43 = john.withAge (43); 

I et slikt tilfelle vil følgende påstander være sanne:

assertThat (john) .isNotSameAs (john43);
assertThat (john.getAge ()). erEqualTo (42);

4. Ekstra verktøy

En slik klassegenerering ville ikke være veldig nyttig uten å kunne tilpasse den. Immutables-biblioteket leveres med et sett med ekstra merknader som kan brukes til å tilpasse @ Verdi. Uformelig‘S output. For å se dem alle, se dokumentasjonen til Immutables.

4.1. De @ Value.Parameter Kommentar

De @ Value.Parameter kommentar kan brukes til å spesifisere felt, for hvilken konstruktormetode skal genereres.

Hvis du kommenterer klassen din slik:

@ Value.Immutable public abstract class Person {@ Value.Parameter abstract String getName (); @ Value.Parameter abstrakt Heltall getAge (); }

Det vil være mulig å instansiere det på følgende måte:

ImmutablePerson.of ("John", 42);

4.2. De @ Value.Default Kommentar

De @ Value.Default kommentar lar deg spesifisere en standardverdi som skal brukes når en startverdi ikke er oppgitt. For å gjøre dette må du opprette en ikke-abstrakt tilgangsmetode som returnerer en fast verdi og kommentere den med @ Value.Default:

@ Value.Immutable public abstract class Person {abstract String getName (); @ Value.Default Integer getAge () {retur 42; }}

Følgende påstand vil være sant:

ImmutablePerson john = ImmutablePerson.builder () .name ("John") .build (); assertThat (john.getAge ()). er EqualTo (42);

4.3. De @ Value.Auxiliary Kommentar

De @ Value.Auxiliary kommentar kan brukes til å kommentere en eiendom som vil bli lagret i et objekt, men som vil bli ignorert av er lik, hashCode og toString implementeringer.

Hvis du kommenterer klassen din slik:

@ Value.Immutable public abstract class Person {abstract String getName (); abstrakt Heltall getAge (); @ Value.Auxiliary abstract String getAuxiliaryField (); }

Følgende påstander vil være sanne når du bruker hjelpestøtte felt:

ImmutablePerson john1 = ImmutablePerson.builder () .name ("John"). Alder (42) .auxiliaryField ("Value1") .build (); ImmutablePerson john2 = ImmutablePerson.builder () .name ("John"). Alder (42) .auxiliaryField ("Value2") .build (); 
assertThat (john1.equals (john2)). isTrue ();
assertThat (john1.toString ()). erEqualTo (john2.toString ()); 
assertThat (john1.hashCode ()). isEqualTo (john2.hashCode ());

4.4. De @ Value.Immutable (Prehash = True) Kommentar

Siden de genererte klassene våre er uforanderlige og aldri kan endres, hashCode resultatene vil alltid forbli de samme og kan bare beregnes en gang under objektets instantiering.

Hvis du kommenterer klassen din slik:

@ Value.Immutable (prehash = true) offentlig abstrakt klasse Person {abstrakt String getName (); abstrakt Heltall getAge (); }

Når du inspiserer den genererte klassen, kan du se det hashcode verdien er nå forhåndsberegnet og lagret i et felt:

@Generated ({"Immutables.generator", "Person"}) offentlig sluttklasse ImmutablePerson utvider Person {private final Strengnavn; privat slutt Heltalder; privat endelig int hashCode; private ImmutablePerson (String name, Integer age) {this.name = name; this.age = alder; this.hashCode = computeHashCode (); } // genererte metoder @ Override public int hashCode () {return hashCode; }} 

De hashCode () metoden returnerer en forhåndsberegnet hashcode generert da objektet ble konstruert.

5. Konklusjon

I denne raske opplæringen viste vi de grunnleggende funksjonene til Immutables-biblioteket.

Alle kildekoder og enhetstester i artikkelen finner du i GitHub-depotet.


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