Nezměnitelné rozhraní - Immutable interface
![]() | tento článek potřebuje další citace pro ověření.Ledna 2018) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
v objektově orientované programování, "neměnné rozhraní" je vzor pro návrh neměnný objekt.[1] Neměnný vzor rozhraní zahrnuje definování typu, který žádný neposkytuje metody které mutují stav. Objekty, na které tento typ odkazuje, nemají žádný proměnlivý stav a vypadají neměnně.
Příklad
Jáva
Zvažte třídu Java, která představuje dvojrozměrný bod.
veřejnost třída Point2D { soukromé int X; soukromé int y; veřejnost Point2D(int X, int y) { tento.X = X; tento.y = y; } veřejnost int getX() { vrátit se tento.X; } veřejnost int getY() { vrátit se tento.y; } veřejnost prázdnota setX(int novýX) { tento.X = novýX; } veřejnost prázdnota setY(int novýY) { tento.y = novýY; }}
Třída Point2D je proměnlivá: její stav lze po konstrukci změnit vyvoláním jedné z metod setteru (setX ()
nebo setY ()
).
Neměnné rozhraní pro Point2D lze definovat jako:
veřejnost rozhraní ImmutablePoint2D { veřejnost int getX(); veřejnost int getY();}
Tím, že Point2D implementuje ImmutablePoint2D, by mohl klientský kód nyní odkazovat na typ, který nemá mutující metody, a tak se jeví jako neměnný. To je ukázáno v následujícím příkladu:
ImmutablePoint2D směřovat = Nový Point2D(0,0); // na konkrétní instanci Point2D odkazuje neměnné rozhraníint X = směřovat.getX(); // platné volání metodyint y = směřovat.setX(42); // chyba kompilace: metoda setX () na typu ImmutablePoint2D neexistuje
Odkázáním pouze na neměnné rozhraní není platné volat metodu, která mutuje stav konkrétního objektu.
Výhody
- Jasně komunikuje neměnný záměr typu.
- Na rozdíl od typů implementujících Nezměnitelná obálka vzor, nemusí "zrušit" mutující metody vydáním "Žádná operace "instrukce nebo vyvolání výjimky za běhu, když je vyvolána metoda mutace.
Nevýhody
- Je možné, aby instance odkazované neměnným typem rozhraní byly obsazení na jejich konkrétní, proměnlivý typ a jejich stav bude mutován. Například:
veřejnost prázdnota mutovat(ImmutablePoint2D směřovat) { ((Point2D)směřovat).setX(42); // toto volání je legální, protože typ má // byly převedeny do proměnlivé třídy Point2D}
- Konkrétní třídy musí výslovně deklarovat, že implementují neměnné rozhraní. To nemusí být možné, pokud konkrétní třída „patří do“ kódu třetí strany, například pokud je obsažena v knihovně.
- Objekt není opravdu neměnný, a proto není vhodný pro použití v datových strukturách spoléhajících na neměnnost, jako jsou hash mapy. A objekt mohl být modifikován souběžně z „proměnlivé strany“.
- Některé optimalizace kompilátoru dostupné pro neměnné objekty nemusí být k dispozici pro proměnlivé objekty.
Alternativy
Alternativou k neměnnému vzoru rozhraní je neměnný obal vzor.
Trvalé datové struktury jsou skutečně neměnné a zároveň umožňují upravené pohledy na sebe.
Reference
- ^ Nezměnitelné rozhraní, c2.com
- neměnný, mindprod.com
- Peter Haggar, „Practical Java Praxis 65: Use Inheritance or Delegation to Define Immutable Classes“, informIT, 22. ledna 2001