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.