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:

Az enum esetében nem megengedett kiterjesztési záradék

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!