Junior
Ako vytvoriť jediný inštanciu triedy v Android?
sobes.tech AI
Odpoveď od AI
V Androidu sa zvyčajne používa vzor Singleton na vytvorenie jediného inštancie triedy.
Existuje niekoľko spôsobov implementácie Singleton:
-
Lazná inicializácia so synchronizáciou:
public class Singleton { private static Singleton instance; private Singleton() { // Privátny konštruktor zabraňuje vytvoreniu ďalších inštancií } public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }- Výhody: Vlákno-bezpečné.
- Nevýhody: Synchronizácia môže znižovať výkon pri častom volaní.
-
Inicializácia pri načítaní triedy (Eager initialization):
public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } }- Výhody: Vlákno-bezpečné bez explicitnej synchronizácie. Jednoduchšie.
- Nevýhody: Inštancia je vytvorená ihneď pri načítaní triedy, aj keď sa nepoužíva.
-
Double-checked locking:
public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }- Výhody: Zvýšený výkon v porovnaní s jednoduchou synchronizáciou, inicializácia iba pri potrebe.
- Nevýhody: Vyžaduje
volatilepre správnu funkciu v viacvláknovom prostredí (od Java 5). Zložitejšie.
-
Statická vnútorná trieda:
public class Singleton { private Singleton() {} private static class SingletonHolder { public static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.INSTANCE; } }- Výhody: Vlákno-bezpečné, lenivá inicializácia, jednoduchá implementácia. Najodporúčanejší prístup v moderných verziách Javy.
-
Použitie Enum:
public enum Singleton { INSTANCE; // Pridajte metódy triedy public void doSomething() { // ... } }- Výhody: Najjednoduchší a vlákno-bezpečný spôsob, odolný voči serializácii a reflexii. Často považovaný za najlepšiu prax.
Voľba implementácie závisí od konkrétnych požiadaviek na výkon a zložitosť. V Androide sa často používajú Enum alebo statická vnútorná trieda.