2010-10-05 146 views
19

Estoy desarrollando una aplicación de Android y soy muy nuevo en Java y Android.Archivo de constantes de Java

Quiero crear algunas constantes para usar en algunas actividades. ¿Dónde puedo definir estas constantes?

Gracias.

Respuesta

45

Se considera una mala práctica en Java, y la mayoría de los lenguajes orientados a objetos, para definir una clase simplemente para mantener constantes. Es mucho mejor definir las constantes en una clase a la que están asociadas. Usualmente hay uno. p.ej.

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

Si realmente no hay nadie, puede definir una clase por separado.

EDIT: Las cosas claves aquí son:

  1. Hacer las constantes fácil de encontrar. Si hay un lugar "natural" para colocarlos, colóquelos allí (es decir, la altura predeterminada para los objetos componentes pertenece a la clase Componente).
  2. No tiene un acoplamiento más alto de lo que necesita. Poner todas las constantes en una clase 'Constantes' hace que el acoplamiento sea alto, especialmente porque los modificadores subsecuentes tienden a poner TODAS las constantes en la clase Constantes, ya sea que haya otra clase en la que puedan incluirse naturalmente
  3. Solo porque La constante es utilizada por más de una clase, lo que no significa que deba estar en una clase 'Constantes'. Si la 'Aplicación' usa una constante y las clases que usan la clase de Aplicación, entonces colóquela en la clase de Aplicación. De esa forma no estás aumentando el acoplamiento.
+0

interesante, acabo de leer que las variables y las constantes no deberían estar dentro de una interfaz para la legibilidad del código. Estoy de acuerdo con eso, porque creo que un buen nombre y una clase 'Constantes' es mucho mejor, porque la mayoría de las constantes se utilizarán en diferentes clases. Si usa constantes para "configurar" la aplicación, también es bueno tener algo en un solo lugar – WarrenFaith

+3

Las variables no pueden estar dentro de una interfaz. Las constantes deberían ser, creo, si son relevantes para todas las clases que implementan la interfaz. Si sus constantes son utilizadas por TODAS las clases, entonces sí, póngalas en una clase Constantes (como dije anteriormente). Si se usan para configurar la aplicación, entonces tal vez pertenezcan a la clase de Aplicación. Lo clave es facilitar su búsqueda y no tener un alto nivel de acoplamiento con ninguna clase. Una clase de Constantes tiende a estar muy acoplada si no se trata con cuidado. – DJClayworth

18

Normalmente, tendrá que utilizar una clase de constantes, o definir en clases donde se utilizan, al estilo de:

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

entonces lo que se refieren a ellos por:

String inst = Constants.SOME_TEXT; 
+8

Sé que acaba de mostrar ejemplos, pero me gustaría hacer hincapié en que uno no debe usar CONST_ como un prefijo para las constantes. ALL_CAPS es la forma estándar de indicar una constante. –

+0

También podría convertirlo en una interfaz en lugar de una clase. –

+0

Correcto, es solo un ejemplo, y probablemente recuerde los antecedentes del solicitante si proviene de C/C++ (que es lo que siento al respecto). – billjamesdev

0

Puede definir algunas constantes en enumeraciones de Java.

Un solo enumerador de Java puede contener múltiples campos de datos asociados.

Oracle proporciona this introduction to Java enumerations.

+5

Acceder a los enumeradores es una operación bastante lenta, en comparación con las variables locales o "estática final" (que, por lo que sé, se compila en línea compilada por el compilador de java). Además, los enumeradores tienen una sobrecarga bastante alta, cuando se trata de uso de memoria/espacio. Ver http://developer.android.com/guide/practices/design/performance.html#avoid_enums – Tseng

7

La forma más común es el de crear 'constants' en las clases eran los necesita:

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

En lugar de privada también puede ser declarado default, protegido o público. Aunque se considera un OO anti pattern para definir constantes, hay una clase especial 'constantes' (God) que almacena constantes para toda la aplicación. Alternativamente, también puede almacenar datos de configuración en un Java properties file, esto no se considera un antipatrón.

Otra opción, que está ganando rápidamente popularidad, es el uso del patrón Dependency Inject (DI). A menudo, este patrón se usa para el objeto depend, pero también se puede usar para inyectar valores constantes en los objetos.Esto puede por ejemplo ser implementado con marco Guice DI ligera de Google:

class Example { 
    String filename; 

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

En una clase especial Binder va a encuadernar un valor a las cadenas con anotada @ConfigFilename. De esta manera, tiene un acoplamiento mínimo y clases que pueden ser probadas independientemente.

+0

Si utilizo un archivo de propiedades en Android. ¿Dónde puedo ponerlo? – VansFannel

+0

Hay varias formas, por ejemplo, de leer el archivo de propiedades del classpath (directorio con clases): http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html – Kdeveloper

+0

Daga también es genial https://github.com/square/dagger – Caipivara

Cuestiones relacionadas