Nemrég beleásta magát a singleton tervezési mintába , hogyan valósítsa meg Java nyelven, és mire való. De mi van akkor, ha elmondom, hogy a Java a saját egyedi hangjával érkezik? Érdekelt? Akkor merüljünk bele.
Valószínűleg már ismeri az Enum osztályt . Van egy különleges tulajdonsága, amellyel tisztában kell lennie. Pontosabban, az Enum az egyszemélyes tervezési mintát valósítja meg. Ez a lehetőség majdnem megegyezik a nyilvános mezőt magában foglaló szingli megközelítéssel.
Singleton mint enum:
public enum Device {
PRINTER
}
Singleton, mint nyilvános változó:
public class Printer {
public static final Printer PRINTER = new Printer();
private Printer() {
}
//…
}
Az enum- megközelítés kompaktabb, mint a publikus megközelítés, mivel nem kell saját implementációt írnunk. A legfontosabb, hogy az enumoknak nincs gondja a szerializálással.
Az enumok szerializálása másképpen működik, mint a közönséges objektumok esetében: csak az enum nevének értéke kerül sorba. A deszerializálás során a metódus a deserializált névvel kerül felhasználásra egy példány lekéréséhez. Ezenkívül az enum megvédheti Önt a tükröződési támadásoktól .
A reflexióról többet megtudhat a második modul leckéiből, ahol a Reflection API-t fogjuk felfedezni . |
A Java tiltja az enumok példányosítását – ez a korlátozás a Constructor osztály newInstance metódusának megvalósításában , amelyet gyakran hívnak meg, amikor reflexióval hoznak létre objektumokat.
Kódrészlet a Constructor.newInstance fájlból . enum létrehozására szolgál :
if ((clazz.getModifiers() & Modifier.ENUM) != 0)
throw new IllegalArgumentException("Cannot reflectively create enum objects");
Az enum használatának hátrányai egy szingli létrehozásához a következők:
-
A lusta inicializálás hiánya, mivel az objektum azonnal létrejön, és az inicializálás nem késleltethető.
-
Más osztályok nem hosszabbíthatók meg. Ez azt jelenti, hogy azokban az esetekben, amikor egy másik osztályt kell örökölnie, nem fog működni, ha az enumot szingliként használjuk. Ilyenkor a többi, számunkra már ismert megvalósítási lehetőséghez kell fordulnunk: statikus metódushoz vagy publikus változóhoz.
-
Ha az enum-ot szingliként használja, csak egy enum- mezőt használhat .
public enum Device extends Electricity {
PRINTER
}
Ez a kód fordítási hibát ad:
De ha interfészt kell implementálnunk, akkor nincs gond, hiszen az enum interfészt is tud megvalósítani:
public enum Device implements Electricity {
PRINTER
}
Ha nem kell öröklődést használnia, a legjobb, ha az egyszemélyes mintát az enum segítségével valósítja meg . Nem vagyunk egyedül, ha ezt ajánljuk – maga Joshua Bloch is ezt teszi .
Ez a megvalósítási megközelítés kényelmet, tömörséget, sorozatgyártást, védelmet a visszaverődésekkel szembeni támadásokkal szemben és egyediséget biztosít – mindent, amire egy jó singletonnak szüksége van!
GO TO FULL VERSION