Úvod do nemenných

1. Úvod

V tomto článku si ukážeme, ako pracovať s knižnicou Immutables.

Knižnica pozostáva z anotácií a anotačných procesorov na generovanie a prácu so serializovateľnými a prispôsobiteľnými nemennými objektmi.

2. Maven závislosti

Aby ste mohli vo svojom projekte použiť Immutables, musíte do súboru pridať nasledujúcu závislosť závislosti časť vašej pom.xml spis:

 poskytnutá hodnota org.immutables 2.2.10 

Pretože tento artefakt nie je vyžadovaný počas behu programu, je vhodné určiť za predpokladu rozsah.

Najnovšiu verziu knižnice nájdete tu.

3. Nemenné

Knižnica generuje nemenné objekty z abstraktných typov: Rozhranie, Trieda, Anotácia.

Kľúčom k dosiahnutiu tohto cieľa je správne používanie @ Hodnota. Nezmeniteľné anotácia. Generuje nemennú verziu anotovaného typu a pred svoje meno dáva predponu Nezmeniteľné kľúčové slovo.

Ak sa pokúsime vygenerovať nemennú verziu triedy s názvom „X“, Vygeneruje triedu s názvom „ImmutableX“. Generované triedy nie sú rekurzívne nemenné, takže je dobré mať to na pamäti.

A krátka poznámka - pretože program Immutables využíva spracovanie anotácií, musíte nezabudnúť povoliť spracovanie anotácií vo vašom IDE.

3.1. Použitím @ Hodnota. Nezmeniteľné S Abstraktné triedy a Rozhrania

Vytvorme jednoduchý abstraktné trieda Osoba pozostávajúci z dvoch abstraktné prístupové metódy predstavujúce polia, ktoré sa majú generovať, a potom anotovať triedu pomocou @ Hodnota. Nezmeniteľné anotácia:

@ Hodnota.Imutovateľná verejná abstraktná trieda Osoba {abstrakt String getName (); abstraktné celé číslo getAge (); }

Po dokončení spracovania anotácie môžeme nájsť ready-to-use, novo generované ImmutablePerson trieda v a cieľ / generované zdroje adresár:

@Generated ({"Immutables.generator", "Person"}) verejná posledná trieda ImmutablePerson rozširuje Person {private final Názov reťazca; súkromný konečný celočíselný vek; private ImmutablePerson (meno reťazca, celé číslo) {this.name = meno; this.age = vek; } @Override Reťazec getName () {návratové meno; } @Override Integer getAge () {návratový vek; } // toString, hashcode, equals, copyOf a Builder vynechané}

Vygenerovaná trieda sa dodáva s implementovanou natiahnuť, hashcode, rovná sa metódami a s výrobcom stupňov ImmutablePerson.Builder. Všimnite si, že vygenerovaný konštruktor má súkromné prístup.

Za účelom vytvorenia inštancie ImmutablePerson triedy, musíme použiť builder alebo statickú metódu ImmutablePerson.copyOf, ktorý môže vytvoriť ImmutablePerson kópia z a Osoba objekt.

Ak chceme vytvoriť inštanciu pomocou nástroja na tvorbu, môžeme jednoducho kódovať:

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

Vygenerované triedy sú nemenné, čo znamená, že ich nemožno upravovať. Ak chcete upraviť už existujúci objekt, môžete použiť jeden z „withX”Metódy, ktoré nemodifikujú pôvodný objekt, ale vytvárajú novú inštanciu s upraveným poľom.

Poďme sa aktualizovať john vek a vytvoriť nový john43 objekt:

ImmutablePerson john43 = john.withAge (43); 

V takom prípade budú platiť nasledujúce tvrdenia:

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

4. Ďalšie pomocné programy

Takéto generovanie triedy by nebolo veľmi užitočné bez toho, aby sme si ho mohli prispôsobiť. Knižnica Immutables obsahuje sadu ďalších poznámok, ktoré je možné použiť na prispôsobenie @ Hodnota. NezmeniteľnéVýstup. Všetky z nich nájdete v dokumentácii Immutables.

4.1. The @ Hodnota. Parameter Anotácia

The @ Hodnota. Parameter anotáciu je možné použiť na zadanie polí, pre ktoré by sa mala generovať metóda konštruktora.

Ak svoju triedu anotujete takto:

@ Value.Imutable public abstract class Person {@ Value.Parameter abstract String getName (); @ Hodnota.Parameter abstrakt Celé číslo getAge (); }

Bude možné vytvoriť inštanciu nasledujúcim spôsobom:

ImmutablePerson.of ("John", 42);

4.2. The @ Hodnota. Predvolené Anotácia

The @ Hodnota. Predvolené anotácia umožňuje určiť predvolenú hodnotu, ktorá sa má použiť, ak nie je poskytnutá počiatočná hodnota. Aby ste to dosiahli, musíte vytvoriť neabstraktnú metódu prístupu, ktorá vráti pevnú hodnotu a anotovať ju @ Hodnota. Predvolené:

@ Hodnota.Imutovateľná verejná abstraktná trieda Osoba {abstrakt String getName (); @ Value.Default Integer getAge () {návrat 42; }}

Bude platiť nasledujúce tvrdenie:

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

4.3. The @ Hodnota. Pomocné Anotácia

The @ Hodnota. Pomocné anotáciu je možné použiť na anotáciu vlastnosti, ktorá bude uložená v inštancii objektu, ale bude ignorovaná rovná sa, hashCode a natiahnuť implementácie.

Ak svoju triedu anotujete takto:

@ Hodnota.Imutovateľná verejná abstraktná trieda Osoba {abstrakt String getName (); abstraktné celé číslo getAge (); @ Value.Auxiliary abstract String getAuxiliaryField (); }

Nasledujúce tvrdenia budú pravdivé pri použití pomocný lúka:

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.Imutable (Prehash = True) Anotácia

Pretože naše generované triedy sú nemenné a nikdy sa nedajú upraviť, hashCode výsledky zostanú vždy rovnaké a dajú sa vypočítať iba raz počas inštancie objektu.

Ak svoju triedu anotujete takto:

@ Value.Immutable (prehash = true) verejná abstraktná trieda Osoba {abstrakt String getName (); abstraktné celé číslo getAge (); }

Pri kontrole vygenerovanej triedy to vidíte hashcode hodnota je teraz predpočítaná a uložená v poli:

@Generated ({"Immutables.generator", "Person"}) verejná posledná trieda ImmutablePerson rozširuje Person {private final Názov reťazca; súkromný konečný celočíselný vek; private final int hashCode; private ImmutablePerson (meno reťazca, celé číslo) {this.name = meno; this.age = vek; this.hashCode = computeHashCode (); } // vygenerovane metody @Override public int hashCode () {navrat hashCode; }} 

The hashCode () metóda vráti predpočítané hashcode generované pri stavbe objektu.

5. Záver

V tomto rýchlom výučbe sme si ukázali základné fungovanie knižnice Immutables.

Všetky zdrojové kódy a testy jednotiek v článku nájdete v úložisku GitHub.


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