Junior
Kuidas luua Androidis klassi ainus eksemplar?
sobes.tech AI
Vastus AI-lt
Androidis kasutatakse tavaliselt Singleton mustrit klassi ainukese eksemplari loomiseks.
On mitu Singletoni rakendamise viisi:
-
Hilis initsialiseerimine koos sünkroniseerimisega:
public class Singleton { private static Singleton instance; private Singleton() { // Privaatne konstruktor takistab teiste eksemplaride loomist } public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }- Eelised: Tõrke- ja niiditurvaline.
- Miinused: Sünkroniseerimine võib aeglustada jõudlust sagedaste väljakutsete korral.
-
Klassi laadimise ajal initsialiseerimine (Eager initialization):
public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } }- Eelised: Niiditurvaline ilma selge sünkroniseerimiseta. Lihtsam.
- Miinused: Eksemplar luuakse kohe klassi laadimisel, isegi kui seda ei kasutata.
-
Kahekordne kontrollitud lukustus (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; } }- Eelised: Suurem jõudlus võrreldes lihtsa sünkroniseerimisega, initsialiseerub ainult vajadusel.
- Miinused: Nõuab
volatileõige toimimise jaoks mitme niidiga keskkonnas.
-
Staatiline sisemine klass:
public class Singleton { private Singleton() {} private static class SingletonHolder { public static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.INSTANCE; } }- Eelised: Niiditurvaline, hiline initsialiseerimine, lihtne rakendada. Soovitatav kaasaegsetes Java versioonides.
-
Enum kasutamine:
public enum Singleton { INSTANCE; // Lisame klassi meetodid public void doSomething() { // ... } }- Eelised: Kõige lihtsam ja niiditurvaline viis, vastupidav serialiseerimisele ja refleksioonile. Sageli peetakse parimaks praktikaks.
Valik sõltub konkreetsetest jõudlus- ja keerukusnõuetest. Androidis kasutatakse sageli Enum või statilist sisemist klassi.