Qual é a melhor maneira de definir constantes no Android, seja classe estática, interface ou recurso xml?

98

Estou desenvolvendo um aplicativo android que usa serviço web para obter dados do servidor, para isso estou tendo três conjuntos diferentes de URLs para apontar sistema de desenvolvimento, servidor de teste e servidor ao vivo. É difícil alterar o URL sempre que desejo fornecer um aplicativo para teste / ao vivo. então planejei torná-lo configurável, para que o aplicativo possa obter a URL apropriada com base na constante de configuração do meu tipo de compilação. Assim,

  • qual é a melhor maneira de manter essas constantes, classe estática java ou interface pública java ou arquivo de recurso xml.? Quando? Por quê?
  • qual dá melhor desempenho ?, quando? Por quê?

Ex: 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 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
fonte
1
Eu duvido que o desempenho seja um problema aqui ...
Alex Lockwood
Se as chamadas de serviço da Web são em uma única classe ou em várias classes?
Venky
@venky, isso em várias classes, cada uma para uma finalidade diferente, ou seja, uma para autenticação do usuário, outra para fazer download de dados e assim ..
Jayabal

Respostas:

92

Há uma grande diferença entre os dois porque você pode fazer referência a recursos do projeto em seus layouts XML. Eles estão disponíveis no contexto do aplicativo e, portanto, acessíveis em todo o aplicativo global. As maiores vantagens de usar os recursos do projeto são a facilidade de acesso e que permitem organizar significativamente o seu projeto.

static finalconstantes são compiladas no bytecode java; os recursos do projeto são compilados em um formato binário dentro do apk. O acesso a qualquer um deles é extremamente eficiente ... se houver diferença entre os dois, é no máximo trivial.

Não existe uma regra definida sobre como você deve usar recursos / constantes em seu projeto. Dito isso, eu pessoalmente uso recursos para valores que posso precisar usar em meu código XML ou Java. Por outro lado, normalmente uso static finalconstantes para valores que serão usados ​​por meu código Java e são específicos para minha implementação.

Observe também que é possível carregar recursos XML em tempo de execução, dependendo da configuração atual do dispositivo (ou seja, tamanho da tela, localidade, etc.). Portanto, você deve levar isso em consideração ao decidir se deve ou não declarar a constante em XML ou diretamente em seus .javaarquivos.

Alex Lockwood
fonte
recursos são muito mais fáceis de configurar em diferentes sabores / tipos de compilação
HopefullyHelpful
@Alex Tenho uma dúvida, pode esclarecê-la: É recomendado usar menos variáveis ​​estáticas, então se criarmos um arquivo constante com variável estática isso não afetará o desempenho de nossa aplicação?
Pallavi
2
Um ponto adicional a se considerar é que, se uma constante final for usada em várias classes, todos esses objetos precisarão ser recompilados se a constante for alterada. Mas esse não é o caso se a constante for armazenada como um recurso. Essa pode ser uma consideração importante para um grande projeto que leva muito tempo para ser compilado.
orodbhen,
23

Para as pessoas que querem ver como podemos usar uma classe para definir nossas constantes e chamar qualquer onde precisarmos.

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;
}

Agora podemos usar as constantes acima da seguinte maneira.

Constant.NOTICE_BUTTON_BLINK_DURATION
Mahen
fonte
1
A pergunta foi feita da melhor maneira !!
shadygoneinsane
@Umar Eu quero usar funções diferentes diferentes URL diferente diferente, por favor me ajude, antes disso eu estava usando o mesmo como urs
Kuldeep Singh
11

No caso geral:

  • Os valores XML têm a vantagem de acessibilidade no arquivo de layout e arquivo de manifesto sobre constantes no arquivo java
  • Os valores XML têm a vantagem de oferecer suporte a vários idiomas em relação às constantes no arquivo java
Dheeresh Singh
fonte
1
obrigado Dheeresh, sim entendi, é muito útil manter a configuração em xml que são acessados ​​por ambos os layouts, manifest e java
Jayabal
2

É sempre uma boa prática extrair strings de IU do código do aplicativo e mantê-las em um arquivo externo. O Android facilita isso com um diretório de recursos em cada projeto Android.

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

Samir Mangroliya
fonte
A questão é sobre constantes a serem usadas internamente apenas pelo código Java. É um cenário diferente. Para o caso específico das tags de texto pertencentes à interface do usuário, como você mencionou, não há dúvida de que o lugar certo são os recursos XML do projeto Android.
cesargastonec
2

Eu acho que as duas coisas parecem ser boas, mas o problema é que depende de suas necessidades.

Se você tem seus valores (link de serviço da web) em seu XML e supõe que haja alguma alteração em seus valores (link de serviço da web), você pode facilmente alterar apenas no arquivo XML.

Mas se você usar classes internas como variáveis ​​estáticas, terá que mudar em todos os arquivos de classe.

Portanto, minha sugestão é separar as constantes do arquivo de origem, colocá-las no recurso e acessá-lo.

Venky
fonte
1
"você pode alterar facilmente apenas em arquivo XML" É tão fácil quanto alterá-lo em um arquivo Java, e em ambos os casos você precisará reconstruir o projeto, então não acho que isso seja uma diferença, deixe de lado uma vantagem.
Fran Marzoa
0

Estou feliz que alguém perguntou isso ... mais um!

Os recursos do projeto precisam de acesso ao Contexto, que não está disponível nos métodos estáticos (a menos que você o passe etc.), mas sempre disponível na Atividade - parece haver uma conexão preferencial entre os recursos e os layouts. Para variáveis ​​e constantes de aplicativos que podem ser processadas em métodos estáticos, crio uma classe abstrata e faço uma importação estática (dessa classe de constantes) em todos os outros arquivos de classe do projeto.

PVS

PVS
fonte