Bevezetés a megváltoztathatatlanokba

1. Bemutatkozás

Ebben a cikkben bemutatjuk, hogyan kell működni az Immutables könyvtárral.

A könyvtár annotációkból és annotációs processzorokból áll, amelyek sorozatszerűsíthető és testreszabható megváltoztathatatlan objektumok létrehozására és működtetésére szolgálnak.

2. Maven-függőségek

Az Immutables használatához a projektben hozzá kell adnia a következő függőséget a függőségek szakasza pom.xml fájl:

 org.immutables értéke 2.2.10 megadva 

Mivel a műtárgy nem szükséges futás közben, ezért célszerű megadni a biztosítani hatálya.

A könyvtár legújabb verziója itt található.

3. Megváltozhatatlanok

A könyvtár megváltoztathatatlan objektumokat generál absztrakt típusokból: Felület, Osztály, Megjegyzés.

Ennek elérésének kulcsa a @ Érték. Megváltozhatatlan annotáció. Létrehoz egy kommentálatlan típus változhatatlan változatát, és a nevét a Változhatatlan kulcsszó.

Ha megpróbálunk létrehozni egy osztály változhatatlan verziót,x“, Létrehoz egy nevű osztályt „ImmutableX”. A generált osztályok nem rekurzívan megváltoztathatatlanok, ezért jó ezt szem előtt tartani.

És egy gyors megjegyzés - mivel az Immutables annotáció-feldolgozást használ, emlékeznie kell arra, hogy engedélyezze a kommentár-feldolgozást az IDE-ben.

3.1. Használata @ Érték. Megváltozhatatlan Val vel Absztrakt osztályok és Interfészek

Hozzunk létre egy egyszerű absztrakt osztály Személy kettőből áll absztrakt a létrehozandó mezőket képviselő hozzáférési módszerek, majd az osztályt a @ Érték. Megváltozhatatlan kommentár:

@ Érték. Megválaszthatatlan nyilvános absztrakt osztály Személy {absztrakt karakterlánc getName (); absztrakt Egész szám getAge (); }

Miután az annotáció feldolgozása megtörtént, megtalálhatjuk a használatra kész újonnan létrehozott ImmutablePerson osztály a cél / generált-források Könyvtár:

@Generated ({"Immutables.generator", "Person"}) public final class Az ImmutablePerson kiterjeszti Person {private final String name; privát végső egész kor; privát ImmutablePerson (karakterlánc neve, egész kor) {this.név = név; ez.kor = életkor; } @Orride String getName () {return name; } @Orride Integer getAge () {visszatérési kor; } // toString, hashcode, egyenlő, copyOf és Builder kihagyva}

A generált osztály megvalósítással érkezik Sztring, hash kód, egyenlő módszerekkel és egy lépéskészítővel ImmutablePerson.Builder. Figyelje meg, hogy a létrehozott konstruktor rendelkezik magán hozzáférés.

A ImmutablePerson osztályban az építő vagy statikus módszert kell használnunk ImmutablePerson.copyOf, amely létrehozhat egy ImmutablePerson másolat a Személy tárgy.

Ha egy példányt fel akarunk építeni az építő segítségével, egyszerűen kódolhatjuk:

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

A generált osztályok megváltoztathatatlanok, vagyis nem módosíthatók. Ha módosítani kíván egy már létező objektumot, használhatja awithX”Metódusok, amelyek nem módosítanak egy eredeti objektumot, de egy új példányt hoznak létre egy módosított mezővel.

Frissítsük John's kor és hozzon létre egy új john43 tárgy:

ImmutablePerson john43 = john.Korral (43); 

Ilyen esetben a következő állítások lesznek igazak:

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

4. További segédprogramok

Az ilyen osztálygenerálás nem lenne túl hasznos, ha nem lehetne testre szabni. Az Immutables könyvtárhoz további kommentárok tartoznak, amelyek felhasználhatók a testreszabáshoz @ Érték. MegváltozhatatlanKimenete. Az összes megtekintéséhez olvassa el az Immutables dokumentációját.

4.1. A @ Value.Parameter Megjegyzés

A @ Value.Parameter annotáció használható a mezők meghatározásához, amelyekhez konstruktor metódust kell létrehozni.

Ha így kommentálja az osztályát:

@ Value.Imutable public abstract class Person {@ Value.Parameter abstract String getName (); @ Value.Parameter absztrakt Egész getAge (); }

A következő módon lehet majd példányosítani:

ImmutablePerson.of ("John", 42);

4.2. A @ Value.Default Megjegyzés

A @ Value.Default az annotáció lehetővé teszi egy alapértelmezett érték megadását, amelyet akkor kell használni, ha a kezdeti érték nincs megadva. Ehhez létre kell hozni egy nem elvont hozzáférési módszert, amely rögzített értéket ad vissza, és ezzel meg kell jegyezni @ Value.Default:

@ Érték. Megválaszthatatlan nyilvános absztrakt osztály Személy {absztrakt karakterlánc getName (); @ Value.Default Integer getAge () {return 42; }}

A következő állítás igaz lesz:

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

4.3. A @ Érték. Kiegészítő Megjegyzés

A @ Érték. Kiegészítő annotációval fel lehet használni egy objektum példányában tárolt, de az által figyelmen kívül hagyott tulajdonság kommentálását egyenlő, hash kód és Sztring megvalósítások.

Ha így kommentálja az osztályát:

@ Érték. Megválaszthatatlan nyilvános absztrakt osztály Személy {absztrakt karakterlánc getName (); absztrakt Egész szám getAge (); @ Value.Auxiliary abstract karakterlánc getAuxiliaryField (); }

A következő állítások igazak lesznek a kiegészítő terület:

ImmutablePerson john1 = ImmutablePerson.builder () .name ("John") .age (42) .auxiliaryField ("Érték1") .build (); ImmutablePerson john2 = ImmutablePerson.builder () .name ("John") .age (42) .auxiliaryField ("Value2") .build (); 
assertThat (john1.egyenlő (john2)). isTrue ();
assertThat (john1.toString ()). isEqualTo (john2.toString ()); 
assertThat (john1.hashCode ()). isEqualTo (john2.hashCode ());

4.4. A @ Value.Imutable (Előzetes = True) Megjegyzés

Mivel a generált osztályaink változhatatlanok és soha nem módosíthatók, hash kód az eredmények mindig változatlanok maradnak, és az objektum példányosításakor csak egyszer számíthatók ki.

Ha így kommentálja az osztályát:

@ Érték.Immutable (prehash = true) public abstract class Person {abstract String getName (); absztrakt Egész szám getAge (); }

A generált osztály ellenőrzésekor ezt láthatja hash kód Az értéket most kiszámítják és egy mezőben tárolják:

@Generated ({"Immutables.generator", "Person"}) public final class Az ImmutablePerson kiterjeszti Person {private final String name; privát végső egész kor; private final int hashCode; privát ImmutablePerson (karakterlánc neve, egész kor) {this.név = név; ez.kor = életkor; this.hashCode = computeHashCode (); } // generált módszerek @Orride public int hashCode () {return hashCode; }} 

A hash kód() metódus egy előre kiszámított értéket ad vissza hash kód az objektum elkészítésekor keletkezik.

5. Következtetés

Ebben a gyors bemutatóban bemutattuk az Immutables könyvtár alapvető működését.

A cikk összes forráskódja és egységtesztje megtalálható a GitHub adattárban.