2010-10-05 22 views
19

Sto sviluppando un'applicazione Android e sono molto nuovo su Java e Android.File di costanti Java

Desidero creare alcune costanti da utilizzare in alcune attività. Dove posso definire queste costanti?

Grazie.

risposta

45

E 'considerato cattiva pratica in Java, e la maggior parte dei linguaggi OO, per definire una classe semplicemente per tenere costanti. È molto meglio definire le costanti in una classe a cui sono associate. Di solito ce n'è uno. per esempio.

interface MyComponent { 
    /** The default height for a component */ 
    public static final int DEFAULT_HEIGHT = 5; 
    // other stuff 
} 

Se non c'è davvero nessuno si sente libero di definire una classe separata.

EDIT: Le cose chiave sono:

  1. Fai le costanti facile da trovare. Se c'è un luogo 'naturale' per metterli, mettili lì (cioè l'altezza predefinita per gli oggetti Component appartiene alla classe Component).
  2. Non avere un accoppiamento superiore a quello necessario. Mettere tutte le tue costanti in una classe 'Costanti' rende l'accoppiamento alto, specialmente se i modificatori successivi tendono a mettere TUTTE le costanti nella classe Costanti, indipendentemente dal fatto che ci sia o meno un'altra classe in cui potrebbero essere inserite.
  3. Solo perché un la costante è usata da più di una classe che non significa che dovrebbe essere in una classe 'Costanti'. Se una costante viene utilizzata da "Applicazione" e classi che utilizzano la classe di applicazione, inserirla nella classe Applicazione. In questo modo non stai aumentando l'accoppiamento.
+0

interessante, ho appena letto che le variabili e le costanti non dovrebbero essere all'interno di un'interfaccia per la leggibilità del codice. Sono d'accordo, perché penso che una buona nomenclatura e una classe di 'Constants' siano molto migliori, perché la maggior parte delle costanti sarà usata in classi diverse. Se usi costanti per "configurare" l'app, è anche bene avere qualcosa in un posto – WarrenFaith

+3

Le variabili non possono essere all'interno di un'interfaccia. Le costanti dovrebbero essere, credo, se sono rilevanti per tutte le classi che implementano l'interfaccia. Se le tue costanti sono usate da TUTTE le classi allora sì, inseriscile in una classe Constants (come ho detto sopra). Se vengono utilizzati per la configurazione dell'applicazione, forse appartengono alla classe Application. La loro chiave è renderli facili da trovare e non avere un alto grado di accoppiamento con qualsiasi classe. Una classe Constants tende ad essere molto accoppiata se non viene trattata con cura. – DJClayworth

18

Normalmente, devi usare una classe costanti, o definirli in classi in cui sono utilizzati, a la:

class Constants { 
    public static final int NUM_TRIANGLES = 4; 
    public static final String SOME_TEXT = "This is a constant"; 
} 

allora si sarebbe riferiscono a loro da:

String inst = Constants.SOME_TEXT; 
+8

Conosco i vostri esempi che mostrano solo, ma vorrei sottolineare che non si dovrebbe usare CONST_ come prefisso per le costanti. ALL_CAPS è il modo standard per indicare una costante. –

+0

Puoi anche renderlo un'interfaccia invece di una classe. –

+0

Esatto, è solo un esempio, e probabilmente ricorda lo sfondo del richiedente se proviene da C/C++ (che è l'impressione che ho ottenuto dalla domanda). – billjamesdev

0

È possibile definire alcune costanti nelle enumerazioni Java.

Un singolo enumeratore Java può contenere più campi di dati associati.

Oracle fornisce this introduction to Java enumerations.

+5

L'accesso agli enumeratori è un'operazione piuttosto lenta, rispetto alle variabili locali o "statico finale" (che per quanto ne so viene compilato inline dal compilatore java). Anche gli Enumeratori hanno un overhead piuttosto elevato, quando si tratta di memoria/utilizzo dello spazio. Vedere http://developer.android.com/guide/practices/design/performance.html#avoid_enums – Tseng

7

Il modo più comune è quello di creare 'constants' nelle classi erano ne avete bisogno:

class Example { 
    private static final int FILENAME = "test.txt; 
} 

Invece di privato può anche essere dichiarata default, protetto o pubblico. Sebbene sia considerato un OO anti pattern per definire le costanti è una classe speciale "costanti" (God) che memorizza le costanti per l'intera applicazione. In alternativa, è anche possibile memorizzare i dati di configurazione in un Java properties file, questo non è considerato un anti-modello.

Un'altra opzione, che sta rapidamente guadagnando popolarità, è l'utilizzo del modello Dependency Inject (DI). Spesso questo modello è usato per oggetti dipendenti, ma può anche essere usato per iniettare valori costanti negli oggetti.Questo può ad esempio essere implementato con leggero quadro Guice DI di Google:

class Example { 
    String filename; 

    @Inject 
    public Example(@ConfigFilename String filename) { 
    this.filename = filename;   
    } 

In uno speciale Binder classe che si sarà associare un valore alle stringhe annotati con @ConfigFilename. In questo modo, hai un accoppiamento e classi minimi che possono essere testati indipendentemente.

+0

Se utilizzo un file di proprietà su Android. Dove posso metterlo? – VansFannel

+0

Esistono diversi modi, ad esempio la lettura del file di proprietà dal classpath (directory con classi): http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html – Kdeveloper

+0

Dagger è bello anche https://github.com/square/dagger – Caipivara