![translation](https://cdn.durumis.com/common/trans.png)
Ez egy AI által fordított bejegyzés.
[Hatékony Java] 3. elem: Privát konstruktor vagy felsorolási típus használatával biztosítsd a szingletonságot
- Írás nyelve: Koreai
- •
-
Referencia ország: Minden ország
- •
- Informatika
Válasszon nyelvet
A durumis AI által összefoglalt szöveg
- A singleton egy olyan osztály, amelyből csak egyetlen példány hozható létre, és általában állapot nélküli objektumok vagy egyedi rendszerösszetevők létrehozására használják.
- A singleton létrehozásának módszerei közé tartozik a nyilvános statikus tag, amely egy végső mező, a statikus gyármetódus szolgáltatása és a felsorolási típus használata. A felsorolási típus használata a legjobb módszer.
- Ha egy singleton osztályt serializálunk, akkor meg kell valósítanunk a Serializable interfészt, minden példánymezőt átmenetiként kell megadni, és újra kell definiálni a readResolve() metódust.
Szingleton
A szingleton fogalma
A szingleton egy olyan osztály, amelynek csak egyetlen példányát lehet létrehozni. A szingletonok tipikus példái a státusz nélküli objektumok vagy az egyedi rendszerösszetevők. A szingleton osztályok azonban nehezen tesztelhetők, hacsak nem definiáljuk a típust interfészként és a megvalósítást különálló osztályként.
A szingleton létrehozásának módjai
public static taggal ellátott, final típusú tagváltozó
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() {
}
public void speak() {
System.out.println("elvis");
}
A private konstruktor csak egyszer lesz meghívva az Elvis példány inicializálásakor, és garantálja, hogy az egyetlen példány az egész rendszerben. Azonban a private konstruktor meghívható az AccessibleObject.setAccessible() metódus használata révén is, ami egy reflection-alapú módosítást jelent. Ez a módosítás megakadályozható egy kivétel dobásával a második objektum létrehozásakor.
- Előnyök
- Nyilvánvalóvá teszi az API-n keresztül, hogy az adott osztály szingleton.
- Tömör.
Statikus gyár metódus public static taggal
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() {
}
public static Elvis getInstance() {
return INSTANCE;
}
public void speak() {
System.out.println("elvis");
}
A reflectionen keresztüli módosítások kivételével ez a módszer is garantálja, hogy az egész rendszerben egyetlen példány lesz. Csak a tagváltozót private-ra változtattuk, és az objektum visszatérését statikus gyár metódusra helyeztük át.
- Előnyök
- Az API módosítása nélkül is lehetőség van a szingleton-tulajdonság megszüntetésére.
- Például a statikus gyár metódus szálonként más példányt adhat vissza.
- Lehetőség van generikus szingleton gyár metódusra való áttérésre.
- A statikus gyár metódusának metódus referenciája használható szolgáltatóként.
- Például az Elvis::getInstance helyett Supplier<Elvis> használható.
- Az API módosítása nélkül is lehetőség van a szingleton-tulajdonság megszüntetésére.
Ha nincs szükség a fenti előnyök kihasználására, akkor célszerű az első módszert használni.
Sorszámozott típus használata
public enum Elvis {
INSTANCE;
public void speak() {
System.out.println("elvis");
}
A legcélszerűbb módszer a sorszámozott típus használata. A fenti két módszerhez képest biztonságosabb a reflection támadásokkal szemben, és a kód is tisztább. Ezenkívül, ahogyan később kitérünk rá, a fenti két módszernek van egy hátránya: a sorosításkor további kódot kell hozzáadni.
Fontos azonban megjegyezni, hogy a létrehozni kívánt szingleton lehetővé teszi az interfész öröklését, de nem a szülőosztály öröklését.
Fontos tudnivalók a szingleton osztályok sorosításakor
Ha a fenti módszerek egyikével létrehozott szingleton osztályt szeretnénk sorosítani, akkor a Serializable interfész implementálása mellett minden példány tagváltozót transient-ként kell deklarálni, és a readResolve() metódust felül kell definiálni.
private Object readResolve throws ObjectStreamException {
return INSTANCE;