2013-02-26 19 views
9

Niedawno rozpocząłem prace nad Javą dla Androida.Klasa statyczna w Javie (Android) - użyj lub nie używaj

Mój pomysł polega na stworzeniu jednej klasy statycznej, która załaduje tonę rzeczy na początku i zapisze wyniki na całe życie aplikacji.

Czytałem dużo, jak dzielić obiekt między działaniami i myślę, że najlepiej będzie stworzyć jedną klasę statyczną. Co myślisz? Czy powinienem zastosować inne podejście? Pytam, ponieważ czytałem wiele kontruktów za pośrednictwem Internetu.

Dziękuję.

+0

Najlepszym sposobem jest użycie SharedPreferences – Pragnani

+1

@Pagagnani Współdzielone preferencje są dobre dla niektórych typów danych - małe ilości danych, które pasują do modelu klucz/wartość i nie zajmują dużo czasu, aby załadować je do pamięci. Nie pasuje do każdego problemu. –

+1

Czy masz na myśli * singleton *? "Klasa statyczna" to klasa wewnętrzna, która nie wymaga instancji klasy obejmującej, która nie ma nic wspólnego z udostępnianiem danych w całej aplikacji. – Wyzard

Odpowiedz

16

Jestem zakładając, że jesteś powołując się statycznych pól klasy, w przeciwieństwie do statycznej klasie które, jak Wyzard wskazał, to coś zupełnie innego. Ogólną zasadą jest, że przechowywanie informacji w statycznych polach nie jest dobrym pomysłem w Javie. Powodem tego jest to, że uniemożliwia to tworzenie instancji wielu wystąpień tego, co przechowujesz w klasie.

W konkretnym przypadku Androida, najlepszym sposobem radzenia sobie z problemem konieczności dane przechowywane związane ze stosowaniem sama jest do podklasy klasy android.app.Application i używać go do obsługi aplikacji globalne dane:

class FooApplication extends Application 
{ 
    private String privData; 

    public String getPrivData() { 
     return privData; 
    } 
} 

Następnie należy zadeklarować, że ta klasa jest twoją główną klasą aplikacji (zamiast domyślnej Application).We wpisie w AndroidManifest.xmlapplication dodać następujące:

<application android:name="com.example.application.FooApplication" 
      ...> 
    ... 
</application> 

Następnie można patrzeć instancję aplikacji z dowolnego miejsca wewnątrz aplikacji przy użyciu metody Context.getApplicationContext() który będzie instancją swojej Application podklasy:

FooApplication app = (FooApplication)Context.getApplicationContext(); 
String privData = app.getPrivData(); 

W zależności od miejsca, w którym próbujesz wyszukać podklasę "Aplikacja", może być konieczne wywołanie "getApplicationContext()" bez "Kontekstu":

FooApplication app = (FooApplication)getApplicationContext(); 
String privData = app.getPrivData(); 
+0

Miałem na myśli klasę statyczną. Ok, mam więcej komentarzy na temat tego typu przechowywania danych aplikacji, więc pójdę tą drogą. Dziękuję Ci. – Mihalko

2

Android zapewnia klasę o nazwie Application, która nie będzie gc'd tak długo, jak długo Twoja Aplikacja nie zostanie zabita. Użyj tej klasy do inicjalizacji, klasy statyczne, ponieważ kontenery są nieco brzydkie, ale nie mogę określić, dlaczego tak się dzieje.

Używam ich tylko jako pojemników dla stałych takich jak maski bitowe, których nie można wyrazić jako EnumSet.

Podobnie jak inne posty wspomnieć o SharedPreferences: Myślę, że istnieją preferencje do przechowywania wartości, ale nie do załadowania struktur, które potrzebujesz dla aplikacji. Struktury te powinny być ładowane z konstrukcji, która reprezentuje lub tworzy model dla semantyki danych.

3

Problem z rozwiązaniem polega na tym, że zasadniczo tworzysz ogromny stos globów. Czasami jest to nieuniknione, ale ma takie same problemy, jakie zawsze mają globale - szybko kończy się trudnym do odczytania kodem, który tak naprawdę nie ma dobrej awarii OO. Możesz tego używać, ale używać go oszczędnie - tylko z ważnymi strukturami danych, które naprawdę będą współdzielone między wieloma działaniami.

+1

Wszelkie API, które tworzysz lub używasz ostatecznie sprowadza się do odniesienia, które jest statyczne lub zawsze istnieje podczas życia aplikacji. Wszystko zależy od tego, jak dobrze jest zaprojektowany. – ATrubka

Powiązane problemy