2013-02-24 13 views

Odpowiedz

16

Moja rekomendacja jest ogólnie taka, jak w normalnych warunkach. Android zignorować i po prostu zrobić normalnego rodzaju rzeczy tak:

class Singleton { 
    static Singleton sInstance; 

    static Singleton getInstance() { 
     // NOTE, not thread safe! Use a lock if 
     // this will be called from outside the main thread. 
     if (sInstance == null) { 
      sInstance = new Singleton(); 
     } 
     return sInstance; 
    } 
} 

Teraz nazywają Singleton.getInstance() w miejscu, gdzie jest to potrzebne. Twój singleton zostanie utworzony w tym momencie i będzie ponownie użyty tak długo, jak długo twój proces będzie istnieć. Jest to dobre podejście, ponieważ pozwala na leniwe przydzielanie singletonom (tylko wtedy, gdy są one potrzebne), zamiast wykonywać kilka prac z góry za rzeczy, których od razu możesz nie potrzebować, co powoduje twoje uruchomienie (a tym samym reakcję na użytkownik) cierpieć. Pomaga to również w utrzymaniu kodu w czystości, wszystko o swoim singletonie i jego zarządzaniu znajduje się w jego własnym miejscu i nie zależy od jakiegoś globalnego miejsca uruchamiania aplikacji, aby ją zainicjować.

Także jeśli trzeba kontekście, w swojej pojedyncza:

class Singleton { 
    private final Context mContext; 

    static Singleton sInstance; 

    static Singleton getInstance(Context context) { 
     // NOTE, not thread safe! Use a lock if 
     // this will be called from outside the main thread. 
     if (sInstance == null) { 
      sInstance = new Singleton(context); 
     } 
     return sInstance; 
    } 

    private Singleton(Context context) { 
     // Be sure to use the application context, since this 
     // object will remain around for the lifetime of the 
     // application process. 
     mContext = context.getApplicationContext(); 
    } 
} 
+1

Odradzam używanie singletonu. Nie rozumiem, dlaczego "naprawdę żałujesz, że wprowadziłeś aplikację" '. Możesz napisać zły kod w obie strony, a dzięki singletonowi jest o wiele łatwiej. Kod używający singletonów nie jest łatwy do sprawdzenia. Dostęp do singletonu można uzyskać z dowolnego miejsca, co czasami prowadzi do takich zastosowań jak 'Singleton.getInstance (null)', ponieważ programista jest "pewny", że został już zainicjowany przez pierwsze "Działanie". Z drugiej strony podklasa "Application" tworzy strukturę, której nie da się tak łatwo zepsuć. Uzyskujesz dostęp do modelu i inicjujesz go leniwie, jeśli go tam nie ma. –

+0

@hackbod robi rachunek pugh * Inicjalizacja na żądanie Idiom właściciela * pomoc singletona czy nie jest to istotne dla Androida? opisane w Wikipedii 'public class Singleton { \t // Prywatny konstruktor uniemożliwia instancji z innych klas \t prywatnych Singleton() {} \t/** \t * SingletonHolder ładowany jest na pierwszym wykonaniem Singleton.getInstance() \t * lub pierwszy dostęp do SingletonHolder.INSTANCE, nie wcześniej. \t */ \t prywatna klasa statyczna SingletonHolder { \t \t prywatne statyczne końcowe Singleton INSTANCE = new Singleton(); \t} \t publiczne statyczny Singleton getInstance() {SingletonHolder.INSTANCE \t \t powrotu; \t} } ' – likejiujitsu

1

Jeśli potrzebujesz inicjować pojedynczo (zakładam, że jest to singleton na poziomie aplikacji), odpowiednim sposobem może być rozszerzenie Application i zapewnienie wymaganej inicjalizacji w metodzie onCreate(). Jeśli jednak inicjalizacja jest duża, dobrym pomysłem może być umieszczenie jej w osobnym wątku, który rozpoczyna się od klasy Application.

+5

naprawdę mocno odradzam korzystania z aplikacji w tej sprawie. Zobacz moją odpowiedź na pytanie, jak zalecam zrobienie tego. Naprawdę żałuję, że wprowadziłem aplikację, to ta pułapka na miód uwodzi użytkownika do umieszczenia ogromnego zestawu kodu inicjalizacyjnego w jednym miejscu, który naprawdę nie jest potrzebny i ma negatywne konsekwencje spowalniania uruchamiania aplikacji i wprowadzania niepotrzebnych zależności między oddzielnymi częściami aplikacji. – hackbod

+0

W typowej implementacji singleton będą te klasy jak "odłączone" od samej aplikacji? Czy myślisz, że posiadanie jednego odniesienia do jakiegoś obiektu w Aplikacji i zapewnienie metody dostępu (z leniwą inicjalizacją) jest złym pomysłem? – sandrstar

+0

Nie jestem pewien, co masz na myśli przez odłączenie ... Zaktualizowałem swoją odpowiedź, aby pokazać, jak powinieneś ją napisać, jeśli potrzebujesz kontekstu. Każda implementacja da taki sam czas życia singletonu po utworzeniu (o ile proces jest w pobliżu). – hackbod

Powiązane problemy