¿Cuál es la mejor manera de definir constantes en Android, ya sea clase estática, interfaz o recurso xml?

98

Estoy desarrollando una aplicación para Android que usa un servicio web para obtener datos del servidor, para eso tengo tres conjuntos diferentes de URL para señalar el sistema de desarrollo, el servidor de prueba y el servidor en vivo. Es difícil cambiar la URL cada vez que quiero dar una aplicación para probar / en vivo. así que planeé hacerlo como configurable, para que la aplicación pueda obtener la URL apropiada según mi constante de configuración de tipo de compilación. Entonces,

  • ¿Cuál es la mejor manera de mantener estas constantes, la clase estática java o la interfaz pública java o el archivo de recursos xml? ¿Cuando? ¿Por qué?
  • ¿Cuál da mejor rendimiento ?, ¿ Cuándo? ¿Por qué?

Ej: recurso xml

<integer name="config_build_type">0</integer>
<string-array name="url_authentication">
    <item >http://development.com/xxxx</item>
    <item >http://test.com/xxx</item>
    <item >http://example.com/xxx</item>
</string-array>

Constante estática de Java

public class Config {
    public static final int BUILD_TYPE = 0; // 0 - development, 1 - test, 2 - live
    public static final String[] URL_AUTHENTICATION = {"http://development.com/", "http://test.com/", "http://example.com"};
}
Jayabal
fuente
1
Dudo mucho que el rendimiento sea un problema aquí ...
Alex Lockwood
¿Si las llamadas al servicio web son de clase única o de clases múltiples?
Venky
@venky, eso en múltiples clases, cada uno con un propósito diferente, es decir, uno para la autenticación del usuario, otro para descargar datos y así ..
Jayabal

Respuestas:

92

Existe una gran diferencia entre los dos en que puede hacer referencia a los recursos del proyecto en sus diseños XML. Están disponibles en el contexto de la aplicación y, por lo tanto, son accesibles a través de la aplicación global. Las mayores ventajas de utilizar los recursos del proyecto es la facilidad de acceso y que te permiten organizar tu proyecto de forma significativa.

static finallas constantes se compilan en el código de bytes de Java; Los recursos del proyecto se compilan en formato binario dentro del apk. Acceder a cualquiera de los dos es extremadamente eficiente ... si hay una diferencia entre los dos, es trivial como mucho.

No hay una regla establecida sobre cómo debe usar recursos / constantes en su proyecto. Dicho esto, personalmente uso recursos para valores que podría necesitar usar en mi código XML o java. Por otro lado, normalmente uso static finalconstantes para valores que solo usará mi código Java y que son específicos de mi implementación.

También tenga en cuenta que es posible cargar recursos XML en tiempo de ejecución dependiendo de la configuración actual del dispositivo (es decir, tamaño de pantalla, ubicación, etc.). Por lo tanto, debe tener esto en cuenta al decidir si debe declarar la constante en XML o directamente en sus .javaarchivos.

Alex Lockwood
fuente
Los recursos son mucho más fáciles de configurar en diferentes sabores / tipos de compilación
Con suerte,
@Alex Tengo una duda, ¿puede aclararla? Se recomienda usar menos variables estáticas, por lo que si creamos un archivo constante con variable estática, ¿no afectará el rendimiento de nuestra aplicación?
Pallavi
2
Un punto adicional a considerar es que, si se usa una constante final en múltiples clases, entonces todos esos objetos deberán ser recompilados si se cambia la constante. Pero ese no es el caso si la constante se almacena como un recurso. Esta podría ser una consideración importante para un proyecto grande que requiere mucho tiempo para compilar.
orodbhen
23

Para las personas que quieren ver cómo podemos usar una clase para definir nuestras constantes y llamar a cualquier lugar que necesitemos.

Constant.java

    package org.nrum.nrum;

/**
 * Created by rajdhami on 5/23/2017.
 */
public class Constant {
    public static final String SERVER = "http://192.168.0.100/bs.dev/nrum";
//    public static final String SERVER = "http://192.168.100.2/bs.dev/nrum";
    public static final String API_END = SERVER + "/dataProvider";
    public static final String NEWS_API = API_END + "/newsApi";
    public static final String BANNER_API = API_END + "/bannerApi/lists";
    public static final String NOTICE_API = API_END + "/noticeApi/lists";
    public static final String UPLOAD_PATH = SERVER + "/uploads";
    public static final String UPLOAD_PATH_BANNER = UPLOAD_PATH + "/company_1/banner";
    public static final String UPLOAD_PATH_NEWS = UPLOAD_PATH + "/company_1/news";
    public static final int BANNER_TRANSITION_DURATION = 5000;
    public static final int NOTICE_BUTTON_BLINK_DURATION = 5000;
    public static final int BANNER_FETCH_LIMIT = 3;
}

Ahora podemos usar las constantes anteriores de la siguiente manera.

Constant.NOTICE_BUTTON_BLINK_DURATION
Mahen
fuente
1
¡La pregunta se hizo de la mejor manera!
shadygoneinsane
@Umar Quiero usar diferentes roles diferentes Diferentes URL diferentes, por favor ayúdenme, antes de eso estaba usando lo mismo como urs
Kuldeep Singh
11

En caso general:

  • Los valores XML tienen la ventaja de la accesibilidad en el archivo de diseño y el archivo de manifiesto sobre las constantes en el archivo java
  • Los valores XML tienen la ventaja de admitir varios idiomas sobre las constantes en el archivo java
Dheeresh Singh
fuente
1
gracias Dheeresh, ya lo entendí, es muy útil mantener la configuración en xml a la que se accede por ambos diseños, manifiesto y java
Jayabal
2

Siempre es una buena práctica extraer cadenas de IU del código de su aplicación y mantenerlas en un archivo externo. Android facilita esto con un directorio de recursos en cada proyecto de Android.

http://developer.android.com/training/basics/supporting-devices/languages.html

Samir Mangroliya
fuente
La pregunta es acerca de las constantes para ser utilizadas internamente solo por código Java. Es un escenario diferente. Para el caso concreto de las etiquetas de texto pertenecientes a la interfaz de usuario, como mencionas, no hay duda de que el lugar adecuado son los recursos XML del proyecto de Android.
cesargastonec
2

Creo que ambos sentidos parecen ser buenos, pero lo que pasa es que depende de tus requisitos.

Si tiene sus valores (enlace de servicio web) en su XML y supone que hay algún cambio en sus valores (enlace de servicio web), puede cambiar fácilmente solo en el archivo XML.

Pero si usa clases internas como variables estáticas, debe cambiar todos los archivos de clase.

Entonces, mi sugerencia es que separe las constantes del archivo fuente y colóquelas en el recurso y acceda a él.

Venky
fuente
1
"puede cambiar fácilmente sólo en un archivo XML" Es tan fácil como cambiarlo en un archivo Java, y en ambos casos necesitará reconstruir el proyecto, así que no creo que eso sea una diferencia, deje de lado una ventaja.
Fran Marzoa
0

Me alegra que alguien haya preguntado esto ... ¡más uno!

Los recursos del proyecto necesitan acceso a Contexto, que no está disponible en métodos estáticos (a menos que lo pase, etc.), pero siempre está disponible en Actividad; parece haber una conexión preferencial entre recursos y diseños. Para las variables y constantes de la aplicación que se pueden procesar en métodos estáticos, creo una clase abstracta y hago una importación estática (de esta clase de constantes) en todos los demás archivos de clase del proyecto.

PVS

PVS
fuente