2013-02-26 11 views
9

Recentemente ho iniziato lo sviluppo in Java per Android.Classe statica in Java (Android) - uso o non uso

La mia idea è di creare una classe statica che carichi una tonnellata di materiale all'inizio e memorizzi i risultati per tutta la vita dell'applicazione.

Ho letto molto su come condividere l'oggetto tra le attività e penso che il migliore sarà creare una classe statica. Cosa ne pensi? Dovrei usare un altro approccio? Lo sto chiedendo perché ho letto molte opinioni contrarie su internet.

Grazie.

+0

Il modo migliore è utilizzare SharedPreferences – Pragnani

+1

@Pragnani Le preferenze condivise sono buone per alcuni tipi di dati: piccole quantità di dati che si adattano a un modello chiave/valore e non impiegano molto tempo per essere caricate in memoria. Non si adatta a tutti i problemi. –

+1

Vuoi dire un * singleton *? Una "classe statica" è una classe interna che non richiede un'istanza della sua classe di inclusione, che non ha nulla a che fare con la condivisione di dati a livello di applicazione. – Wyzard

risposta

16

Sto assumendo che si stia riferendo a campi statici di una classe, al contrario di classe statica che, come Wyzard ha sottolineato, è qualcosa di completamente diverso. Come regola generale, tenere le informazioni in campi statici non è una buona idea in Java. La ragione di ciò è che impedisce la possibilità di istanziare più istanze di qualunque cosa si memorizzi nella classe.

Nel caso specifico di un'applicazione Android, il modo migliore per affrontare il problema di avere dati memorizzati associati con l'applicazione stessa è quello di creare una sottoclasse della classe android.app.Application e utilizzarlo per gestire i dati delle applicazioni-global:

class FooApplication extends Application 
{ 
    private String privData; 

    public String getPrivData() { 
     return privData; 
    } 
} 

Quindi è necessario dichiarare che questa classe è la principale classe di applicazione (anziché il valore predefinito Application).Nel application voce nel AndroidManifest.xml aggiungere quanto segue:

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

È possibile poi cercare l'istanza di applicazione da qualsiasi punto all'interno della vostra applicazione utilizzando il metodo Context.getApplicationContext() che sarà un'istanza della Application sottoclasse:

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

A seconda di dove si sta cercando di cercare sottoclassi di "Applicazione", potrebbe essere necessario richiamare "getApplicationContext()" senza "Contesto":

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

Mi riferivo alla classe statica. Ok, ci sono altri commenti su questo tipo di memorizzazione dei dati dell'applicazione, quindi andrò da questa parte. Grazie. – Mihalko

2

Android fornisce una classe denominata Application, che non sarà gc purché l'applicazione non venga uccisa. Utilizzare questa classe per l'inizializzazione, classi statiche poiché i contenitori sono alquanto brutti, ma non riesco a individuare il perché.

Io li uso solo come contenitori per costanti come maschere di bit che non possono essere espresse come EnumSet.

Come gli altri post menzionano SharedPreferences: Penso che esistano le preferenze per memorizzare i valori, ma non per caricare le strutture necessarie per l'applicazione. Queste strutture devono essere caricate da un costrutto che rappresenta o costituisce un modello per la semantica dei dati.

3

Il problema con la soluzione è che stai praticamente creando un enorme ammasso di globali. A volte è inevitabile, ma ha sempre lo stesso tipo di problemi che i globals hanno sempre: si finisce velocemente con un codice difficile da leggere che non ha una buona ripartizione OO. Puoi usare questo, ma usarlo con parsimonia, solo con strutture di dati importanti che saranno davvero condivise tra molte attività.

+1

Qualsiasi API che si crea o si utilizza si riduce a un riferimento statico o sempre esistente durante la vita dell'applicazione. Tutto dipende da quanto bene è stato progettato. – ATrubka