Quelle est la meilleure façon de définir des constantes dans Android, que ce soit une classe statique, une interface ou une ressource XML?

98

Je développe une application Android qui utilise un service Web pour obtenir des données du serveur, pour cela, j'ai trois ensembles différents d'URL pour pointer le système de développement, le serveur de test et le serveur en direct. Il est difficile de changer d'URL chaque fois que je veux donner une demande de test / live. j'ai donc prévu de le rendre configurable, afin que l'application puisse obtenir l'URL appropriée en fonction de la constante de configuration du type de construction. Alors,

  • Quelle est la meilleure façon de conserver ces constantes, classe statique java ou interface publique java ou fichier de ressources xml.? Quand? Pourquoi?
  • qui donne de meilleures performances ?, Quand? Pourquoi?

Ex: ressource 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 statique 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
la source
1
Je doute fortement que la performance soit un problème ici ...
Alex Lockwood
Si les appels de service Web sont en classe unique ou en classe multiple?
Venky
@venky, que dans plusieurs classes, chacun à des fins différentes, à savoir un pour l'authentification de l'utilisateur, un autre pour télécharger des données et ainsi de suite ..
Jayabal

Réponses:

92

Il existe une grande différence entre les deux en ce que vous pouvez référencer des ressources de projet dans vos mises en page XML. Ils sont disponibles dans le contexte de l'application et sont donc accessibles dans l'ensemble de l'application. Les principaux avantages de l'utilisation des ressources du projet sont la facilité d'accès et le fait qu'elles vous permettent d'organiser votre projet de manière significative.

static finalles constantes sont compilées dans le bytecode java; les ressources du projet sont compilées dans un format binaire dans l'apk. L'accès à l'un ou l'autre est extrêmement efficace ... s'il y a une différence entre les deux, c'est tout au plus trivial.

Il n'y a pas de règle définie sur la façon dont vous devez utiliser les ressources / constantes dans votre projet. Cela dit, j'utilise personnellement des ressources pour des valeurs que je pourrais avoir besoin d'utiliser dans mon code XML ou java. D'un autre côté, j'utilise généralement des static finalconstantes pour des valeurs qui ne seront utilisées que par mon code java et qui sont spécifiques à mon implémentation.

Notez également qu'il est possible de charger des ressources XML au moment de l'exécution en fonction de la configuration actuelle de l'appareil (c.-à-d. Taille de l'écran, paramètres régionaux, etc.). Vous devez donc en tenir compte lorsque vous décidez si vous devez déclarer la constante en XML ou directement dans vos .javafichiers.

Alex Lockwood
la source
les ressources sont beaucoup plus faciles à configurer dans différentes saveurs / types de construction
J'espère que cela sera
@Alex J'ai un doute, pouvez-vous le clarifier: il est recommandé d'utiliser moins de variables statiques, donc si nous créons un fichier constant avec une variable statique, cela n'affectera-t-il pas les performances de notre application?
Pallavi
2
Un point supplémentaire à considérer est que, si une constante finale est utilisée dans plusieurs classes, tous ces objets devront être recompilés si la constante est modifiée. Mais ce n'est pas le cas si la constante est stockée en tant que ressource. Cela pourrait être une considération importante pour un grand projet qui prend beaucoup de temps à compiler.
orodbhen
23

Pour les personnes qui veulent voir comment nous pouvons utiliser une classe pour définir nos constantes et appeler celles dont nous avons besoin.

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

Maintenant, nous pouvons utiliser les constantes ci-dessus de la manière suivante.

Constant.NOTICE_BUTTON_BLINK_DURATION
Mahen
la source
1
La question a été posée pour le meilleur moyen !!
shadygoneinsane
@Umar Je veux utiliser différents rôles différents Différentes URL différentes, veuillez aider, avant cela, j'utilisais la même chose comme urs
Kuldeep Singh
11

Dans le cas général:

  • Les valeurs XML ont l'avantage d'être accessibles dans le fichier de mise en page et le fichier manifeste par rapport aux constantes dans le fichier java
  • Les valeurs XML ont l'avantage de prendre en charge plusieurs langues par rapport aux constantes dans un fichier java
Dheeresh Singh
la source
1
merci Dheeresh, oui j'ai compris, il est très utile de conserver la configuration en xml qui est accessible par les deux mises en page, manifest et java
Jayabal
2

Il est toujours recommandé d'extraire les chaînes d'interface utilisateur du code de votre application et de les conserver dans un fichier externe. Android rend cela facile avec un répertoire de ressources dans chaque projet Android.

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

Samir Mangroliya
la source
La question concerne les constantes à utiliser en interne uniquement par le code Java. C'est un scénario différent. Pour le cas spécifique des balises texte appartenant à l'interface utilisateur, comme vous le mentionnez, nul doute que la bonne place sont les ressources XML du projet Android.
cesargastonec
2

Je pense que les deux sens semblent être bons, mais le fait est que cela dépend de vos besoins.

Si vous avez vos valeurs (lien de service Web) dans votre XML et supposez qu'il y a un changement dans vos valeurs (lien de service Web), vous pouvez facilement changer uniquement dans un fichier XML.

Mais si vous utilisez des classes internes comme variables statiques, vous devez modifier tous les fichiers de classe.

Ma suggestion est donc de séparer les constantes du fichier source et de les mettre dans la ressource et d'y accéder.

Venky
la source
1
"vous ne pouvez facilement changer que dans un fichier XML" C'est aussi simple que de le changer dans un fichier Java, et dans les deux cas vous aurez besoin de reconstruire le projet, donc je ne pense pas que ce soit une différence, laissez de côté un avantage.
Fran Marzoa
0

Je suis content que quelqu'un ait posé ça ... plus un!

Les ressources du projet ont besoin d'accéder à Contexte, qui n'est pas disponible dans les méthodes statiques (sauf si vous le transmettez dans etc.), mais toujours disponible dans Activity - il semble y avoir une connexion préférentielle entre les ressources et les mises en page. Pour les variables d'application et les constantes qui peuvent être traitées dans des méthodes statiques, je crée une classe abstraite et j'effectue une importation statique (de cette classe de constantes) dans tous les autres fichiers de classe du projet.

PVS

PVS
la source