Ú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.