Változhatatlan objektumok a Java-ban

1. Áttekintés

Ebben az oktatóanyagban megtudhatjuk, mi teszi az objektumot megváltoztathatatlanná, hogyan lehet elérni a Java-ban a megváltoztathatatlanságot, és milyen előnyökkel jár ez.

2. Mi az a megváltoztathatatlan objektum?

Változhatatlan tárgy egy olyan objektum, amelynek belső állapota a teljes létrehozása után állandó marad.

Ez azt jelenti, hogy egy megváltoztathatatlan objektum nyilvános API-ja garantálja számunkra, hogy egész életében ugyanúgy fog viselkedni.

Ha egy pillantást vetünk az osztályra Húr, láthatjuk, hogy még akkor is, ha úgy tűnik, hogy az API-ja megváltoztatható viselkedést biztosít számunkra cserélje ki módszer, az eredeti Húr nem változik:

Karakterlánc neve = "baeldung"; String newName = név.pótlás ("trágya", "----"); assertEquals ("baeldung", név); assertEquals ("bael ----", újNév);

Az API csak olvasható módszereket ad nekünk, soha nem tartalmazhat olyan módszereket, amelyek megváltoztatják az objektum belső állapotát.

3. Az végső Kulcsszó Java-ban

Mielőtt megpróbálnánk elérni a Java megváltoztathatatlanságát, beszélnünk kell a végső kulcsszó.

Java-ban a változók alapértelmezés szerint módosíthatók, vagyis megváltoztathatjuk az általuk birtokolt értéket.

A végső kulcsszóval egy változó deklarálásakor a Java fordító nem engedi megváltoztatni a változó értékét. Ehelyett fordítási időbeli hibát jelent:

végső karakterlánc neve = "baeldung"; név = "bael ...";

Vegye figyelembe, hogy végső csak azt tiltja, hogy megváltoztassuk a változó birtokában lévő referenciát, ez nem véd minket attól, hogy a nyilvános API használatával megváltoztassuk az objektum belső állapotát:

final List karaktersorozatok = new ArrayList (); assertEquals (0, húrok.méret ()); húrok.add ("baeldung"); assertEquals (0, húrok.méret ());

A második assertEquals sikertelen lesz, mert egy elem hozzáadása a listához megváltoztatja annak méretét, ezért nem változhatatlan objektum.

4. Javíthatatlanság a Java-ban

Most, hogy tudjuk, hogyan lehet elkerülni a változó tartalmának változásait, felhasználhatjuk változtathatatlan objektumok API-jának felépítésére.

Egy megváltoztathatatlan objektum API-jának felépítéséhez meg kell garantálnunk, hogy annak belső állapota nem változik, függetlenül attól, hogy hogyan használjuk az API-t.

A helyes irányba lépés a használat végső attribútumainak deklarálásakor:

osztály Pénz {privát végső dupla összeg; magán végső pénznem; // ...}

Vegye figyelembe, hogy a Java garantálja számunkra, hogy a összeg nem változik, ez a helyzet minden primitív típusú változó esetében.

Példánkban azonban csak azt garantáljuk, hogy a valuta nem fog változni, tehát támaszkodnunk kell a Valuta API, hogy megvédje magát a változásoktól.

Legtöbbször szükségünk van egy objektum attribútumaira az egyéni értékek tárolásához, és az a hely, ahol egy megváltoztathatatlan objektum belső állapotát inicializálni kell, a konstruktora:

osztály Pénz {// ... nyilvános pénz (dupla összeg, pénznem pénzneme) {this.amount = összeg; this.valuta = valuta; } public Pénznem getCurrency () {visszatérési pénznem; } public double getAmount () {return summa; }}

Ahogy azt már korábban mondtuk, egy megváltoztathatatlan API követelményeinek teljesítése érdekében a mi Pénz osztály csak olvasható módszerekkel rendelkezik.

A reflexió API segítségével megtörhetjük a változtathatatlanságot és megváltoztathatjuk a megváltoztathatatlan objektumokat. A reflexió azonban sérti a megváltoztathatatlan objektum nyilvános API-ját, és ezt általában kerülnünk kell.

5. Előnyök

Mivel egy megváltoztathatatlan objektum belső állapota időben állandó marad, biztonságosan megoszthatjuk több szál között.

Szabadon használhatjuk is, és a rá hivatkozó objektumok egyike sem észlel különbséget, ezt mondhatjuk a megváltoztathatatlan tárgyak mellékhatásoktól mentesek.

6. Következtetés

A megváltoztathatatlan objektumok nem változtatják meg időben belső állapotukat, szálbiztosak és mellékhatásoktól mentesek. Ezen tulajdonságok miatt a megváltoztathatatlan objektumok különösen hasznosak többszálas környezetek kezelésénél is.

A cikkben használt példákat a GitHubon találja meg.