J'avais l'habitude de définir un ensemble de constantes liées comme des Bundle
clés ensemble dans une interface comme ci-dessous:
public interface From{
String LOGIN_SCREEN = "LoginSCreen";
String NOTIFICATION = "Notification";
String WIDGET = "widget";
}
Cela me fournit un moyen plus agréable de regrouper les constantes associées et de les utiliser en effectuant une importation statique (pas des implémentations). Je sais que le Android
cadre utilise aussi les constantes de même que Toast.LENTH_LONG
, View.GONE
.
Cependant, je pense souvent que le Java Enums
fournit un moyen bien meilleur et puissant de représenter la constante.
Mais est - il un problème de performence à utiliser enums
sur Android
?
Avec un peu de recherche, j'ai fini dans la confusion. De cette question
? « Évitez les énumérations où vous avez besoin Ints » retirés des conseils de performance Android il est clair que Google
a supprimé « Évitez énumérations » de ses conseils de performance, mais à partir de son docs de formation officiels Soyez au courant des frais généraux mémoire section , il dit clairement: « énumérations nécessitent souvent plus de deux fois plus de mémoire que les constantes statiques. Vous devez strictement éviter d'utiliser les énumérations sur Android. " Est-ce que cela est toujours valable? (Par exemple, dans les Java
versions après 1.6)
Un autre problème que j'ai observé est de les envoyer enums
en intents
utilisant Bundle
je devrais les envoyer par sérialisation (c'est putSerializable()
-à- dire que je pense qu'une opération coûteuse par rapport à la putString()
méthode primitive , même si enums
elle la fournit gratuitement).
Quelqu'un peut-il clarifier quelle est la meilleure façon de représenter la même chose Android
? Dois - je éviter strictement l' utilisation enums
sur Android
?
Enum.ordinal()
place.Réponses:
À utiliser
enum
lorsque vous avez besoin de ses fonctionnalités. Ne l'évitez pas strictement .Java enum est plus puissant, mais si vous n'avez pas besoin de ses fonctionnalités, utilisez des constantes, elles occupent moins d'espace et elles peuvent être primitives elles-mêmes.
Quand utiliser enum:
surcharge de méthode - chaque constante enum a sa propre implémentation d'une méthode
plus de données - votre seule constante contient plus d'une information qui ne peut pas être placée dans une seule variable
Quand ne pas utiliser enum:
vous pouvez accepter des données continues
Les énumérations occupent plus d'espace
Les constantes occupent moins d'espace
la source
Si les énumérations ont simplement des valeurs, vous devriez essayer d'utiliser IntDef / StringDef, comme indiqué ici:
https://developer.android.com/studio/write/annotations.html#enum-annotations
Exemple: au lieu de:
tu utilises:
et dans la fonction qui l'a comme paramètre / valeur renvoyée, utilisez:
Si l'énumération est complexe, utilisez une énumération. C'est pas si mal.
Pour comparer les énumérations et les valeurs constantes, vous devriez lire ici:
Leur exemple est une énumération avec 2 valeurs. Il faut 1112 octets dans le fichier dex contre 128 octets lorsque des entiers constants sont utilisés. Cela a du sens, car les énumérations sont de vraies classes, par opposition à la façon dont cela fonctionne sur C / C ++.
la source
IntDef
annotation, ce sera le cas. Quant aux montres, je pense que c'est assez clair aussi. Quel appareil a plus de puissance CPU, de RAM et de batterie: un téléphone ou une montre? Et lesquels ont besoin d'un logiciel pour être plus optimisé pour les performances à cause de cela?En plus des réponses précédentes, j'ajouterais que si vous utilisez Proguard (et que vous devez absolument le faire pour réduire la taille et obscurcir votre code), alors votre
Enums
sera automatiquement converti@IntDef
partout où c'est possible:https://www.guardsquare.com/en/proguard/manual/optimizations
Par conséquent, si vous avez des valeurs discrètes et qu'une méthode devrait permettre de ne prendre que ces valeurs et pas d'autres du même type, alors j'utiliserais
Enum
, car Proguard fera ce travail manuel d'optimisation du code pour moi.Et voici un bon article sur l'utilisation des énumérations de Jake Wharton, jetez-y un œil.
la source
Non. " Strictement " signifie qu'ils sont si mauvais qu'ils ne devraient pas du tout être utilisés. Il est possible que des problèmes de performances surviennent dans une situation extrême comme de nombreuses opérations (des milliers ou des millions) avec des énumérations (consécutives sur le thread d'interface utilisateur). Les opérations d'E / S réseau qui doivent strictement se produire dans un thread d'arrière-plan sont beaucoup plus courantes . L'utilisation la plus courante des énumérations est probablement une sorte de vérification de type - si un objet est ceci ou cela qui est si rapide, vous ne pourrez pas remarquer une différence entre une seule comparaison d'énumérations et une comparaison d'entiers.
Il n'y a pas de règle générale à ce sujet. Utilisez tout ce qui fonctionne pour vous et vous aide à préparer votre application. Optimisez plus tard - après avoir remarqué un goulot d'étranglement qui ralentit certains aspects de votre application.
la source
Avec Android P, Google n'a aucune restriction / objection à l'utilisation des énumérations
La documentation a changé là où auparavant il était recommandé d'être prudent, mais elle ne le mentionne pas maintenant. https://developer.android.com/reference/java/lang/Enum
la source
Deux faits.
1, Enum est l'une des fonctionnalités les plus puissantes de JAVA.
2, le téléphone Android a généralement beaucoup de mémoire.
Donc ma réponse est NON. J'utiliserai Enum sous Android.
la source
J'aime ajouter que vous ne pouvez pas utiliser @Annotations lorsque vous déclarez une liste <> ou une carte <> où la clé ou la valeur est de l'une de vos interfaces d'annotation. Vous obtenez l'erreur "Les annotations ne sont pas autorisées ici".
Donc, lorsque vous avez besoin de le regrouper dans une liste / carte, utilisez enum, car ils peuvent être ajoutés, mais les groupes @annotated int / string ne le peuvent pas.
la source