Uvod u nepromjenjive

1. Uvod

U ovom ćemo članku pokazati kako raditi s bibliotekom Immutables.

Biblioteka se sastoji od napomena i procesora napomena za generiranje i rad sa serializabilnim i prilagodljivim nepromjenjivim objektima.

2. Ovisnosti Mavena

Da biste u svom projektu koristili Nepromjenjive, morate dodati sljedeću ovisnost u ovisnosti odjeljak vašeg pom.xml datoteka:

 data org. nepromjenjiva vrijednost 2.2.10 

Kako ovaj artefakt nije potreban tijekom izvođenja, stoga je poželjno navesti pod uvjetom opseg.

Najnoviju verziju knjižnice možete pronaći ovdje.

3. Nepromjenjive

Biblioteka generira nepromjenjive objekte iz apstraktnih tipova: Sučelje, Razred, Bilješka.

Ključ za postizanje toga je pravilna uporaba @ Vrijednost.Nepromjenjiv bilješka. Generira nepromjenjivu verziju označenog tipa i imenu stavlja prefiks s Nepromjenjiv ključna riječ.

Ako pokušamo generirati nepromjenjivu verziju klase pod nazivom „x“, Generirat će klasu s imenom “ImmutableX”. Generirani razredi nisu rekurzivno nepromjenjivi, pa je dobro imati to na umu.

I kratka napomena - jer Immutables koristi obradu napomena, morate upamtiti da omogućite obradu napomena u vašem IDE-u.

3.1. Koristeći @ Vrijednost.Nepromjenjiv S Sažetak nastave i Sučelja

Stvorimo jednostavan sažetak razred Osoba koji se sastoji od dva sažetak accessor metode koje predstavljaju buduća generirana polja, a zatim klasu označuju s @ Vrijednost.Nepromjenjiv napomena:

@ Value.Immutable javni sažetak klase Person {abstract String getName (); sažetak Integer getAge (); }

Nakon obrade napomena možemo pronaći spremnu za upotrebu, novonastali Nepromjenjiva osoba razred u a cilj / generirani izvori imenik:

@Generated ({"Immutables.generator", "Person"}) javna završna klasa ImmutablePerson proširuje Person {privatni konačni naziv niza; privatno konačno cjelovito doba; private ImmutablePerson (Ime niza, cijela dob) {this.name = name; this.age = dob; } @Override String getName () {return ime; } @Override Integer getAge () {return age; } // toString, hashcode, equals, copyOf i Builder izostavljeni}

Generirana klasa dolazi s implementiranom toString, hashcode, jednako metode i s graditeljem koraka ImmutablePerson.Builder. Primijetite da generirani konstruktor ima privatni pristup.

Da bi se konstruirala instanca Nepromjenjiva osoba klase, trebamo koristiti graditelj ili statičku metodu ImmutablePerson.copyOf, koji mogu stvoriti Nepromjenjiva osoba kopija iz a Osoba objekt.

Ako želimo konstruirati instancu pomoću graditelja, možemo jednostavno kodirati:

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

Generirane klase su nepromjenjive što znači da se ne mogu mijenjati. Ako želite izmijeniti već postojeći objekt, možete upotrijebiti jedan od “saX”Metode, koje ne modificiraju izvorni objekt, već stvaraju novu instancu s modificiranim poljem.

Ažurirajmo John's dobi i stvoriti novi john43 objekt:

ImmutablePerson john43 = john.withAge (43); 

U tom će slučaju sljedeće tvrdnje biti istinite:

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

4. Dodatni uslužni programi

Takva generacija klase ne bi bila vrlo korisna bez mogućnosti prilagodbe. Biblioteka Immutables dolazi s nizom dodatnih bilješki koje se mogu koristiti za prilagodbu @ Vrijednost.Nepromjenjiv'S output. Da biste ih vidjeli, pogledajte dokumentaciju Immutables-a.

4.1. The @ Vrijednost.Parametar Bilješka

The @ Vrijednost.Parametar napomena se može koristiti za specificiranje polja za koja treba generirati metodu konstruktora.

Ako ovako označite svoj razred:

@ Value.Immutable javni sažetak klase Osoba {@ Value.Parameter sažetak String getName (); @ Value.Parameter sažetak Integer getAge (); }

Bit će moguće instancirati ga na sljedeći način:

ImmutablePerson.of ("Ivan", 42);

4.2. The @ Value.Default Bilješka

The @ Value.Default napomena vam omogućuje da odredite zadanu vrijednost koja bi se trebala koristiti kada početna vrijednost nije navedena. Da biste to učinili, morate stvoriti ne-apstraktnu metodu pristupa koja vraća fiksnu vrijednost i označiti je s @ Value.Default:

@ Value.Immutable javni sažetak klase Person {abstract String getName (); @ Value.Default Integer getAge () {return 42; }}

Sljedeća će tvrdnja biti istinita:

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

4.3. The @ Vrijednost.Pomoćno Bilješka

The @ Vrijednost.Pomoćno anotacija se može koristiti za bilježenje svojstva koje će biti pohranjeno u instanci objekta, ali će ga ignorirati jednako, hashCode i toString implementacije.

Ako ovako označite svoj razred:

@ Value.Immutable javni sažetak klase Person {abstract String getName (); sažetak Integer getAge (); @ Value.Auxiliary abstract String getAuxiliaryField (); }

Sljedeće će tvrdnje biti istinite kada se koristi pomoćni polje:

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

4.4. The @ Value.Immutable (Prehash = True) Bilješka

Budući da su naše generirane klase nepromjenjive i nikada se ne mogu mijenjati, hashCode rezultati će uvijek ostati isti i mogu se izračunati samo jednom tijekom instanciranja objekta.

Ako ovako označite svoj razred:

@ Value.Immutable (prehash = true) javna apstraktna klasa Person {abstract String getName (); sažetak Integer getAge (); }

Kada pregledavate generiranu klasu, to možete vidjeti hashcode vrijednost je prethodno izračunata i pohranjena u polje:

@Generated ({"Immutables.generator", "Person"}) javna završna klasa ImmutablePerson proširuje Person {privatni konačni naziv niza; privatno konačno cjelovito doba; privatni konačni int hashCode; private ImmutablePerson (Ime niza, cijela dob) {this.name = name; this.age = dob; this.hashCode = computeHashCode (); } // generirane metode @Override public int hashCode () {return hashCode; }} 

The hashCode () metoda vraća unaprijed izračunati hashcode generirana kad je objekt konstruiran.

5. Zaključak

U ovom smo brzom vodiču prikazali osnovni rad biblioteke Immutables.

Svi testovi izvornog koda i jedinice u članku mogu se naći u spremištu GitHub.


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