79 votes

Pourquoi Android n'utilise-t-il pas plus d'énums?

J'ai commencé à vraiment comme aide de C# et Java les énumérations dans mon code pour plusieurs raisons:

  • Ils sont beaucoup plus type-safe que des entiers, des chaînes de caractères, ou des ensembles de booléenne drapeaux.
  • Ils conduisent à un code plus lisible.
  • Il est plus difficile de définir un enum pour une valeur non valide qu'un int ou string.
  • Ils le rendent facile à découvrir les valeurs possibles pour une variable ou d'un paramètre.
  • Tout ce que j'ai lu indique que tout entiers en C# et la plupart des machines virtuelles.

Cependant, l'Android cadre a de nombreux cas où des drapeaux de différents types doivent être transmis, mais aucune d'entre elles semblent utiliser les énumérations. Un couple d'exemples où je pense leur utilisation serait bénéfique sont Toast.LENGTH_SHORT / Toast.LENGTH_LONG et View.GONE, View.VISIBLE, etc.

Pourquoi est-ce? Ne enums effectuer de pire que de simples valeurs entières dans Dalvik? Est-il un autre inconvénient que je ne suis pas au courant?

66voto

Cette réponse est de jour en date de Mars 2011.

Les énumérations peuvent être utilisés sur Froyo et en fonction de cette réponse (Pourquoi était "d'Éviter les Énumérations Où Vous avez Seulement Besoin Ints" supprimés à partir de Android astuces pour améliorer les performances?) à partir d'un membre de la VM Android équipe (et son blog).


La Réponse Précédente:

Le fonctionnaire Android recommandation de l'équipe est d'éviter les énumérations, à chaque fois que vous pouvez l'éviter:

Les énumérations sont très pratiques, mais malheureusement peut être douloureux quand la taille de l' et la vitesse de la matière. Par exemple, ceci:

public enum Shrubbery { GROUND, CRAWLING, HANGING }

ajoute 740 octets votre .dex fichier par rapport à la l'équivalent de la classe avec trois publics static final ints. Lors de la première utilisation, le classe d'initialiseur appelle l' méthode sur des objets représentant chaque les valeurs énumérées. Chaque objet obtient son propre champ statique, et la ensemble complet est stocké dans un tableau (un champ statique appelée "$VALEURS"). C'est beaucoup de code et de données, juste pour trois les nombres entiers. En outre, ceci:

Shrubbery shrub = Shrubbery.GROUND;

les causes d'un champ statique de recherche. Si "SOL" ont été static final int, le compilateur de le traiter comme un connu constante et en ligne.

Source: Éviter Les Énumérations Où Vous Avez Seulement Besoin Ints

14voto

Russell Steen Points 4081

Les entiers sont plus petits et nécessitent moins de frais généraux, ce qui est toujours important sur les appareils mobiles.

5voto

prolink007 Points 6712

Un de mes collègues a effectué un petit test sur cette situation. Il a généré automatiquement un class et un enum avec le même montant "d'énums". Je crois qu'il a généré 30000 entrées.

Les résultats ont été:

  • .class pour le class était d'environ 1200KB
  • .class pour le enum était d'environ 800 Ko

J'espère que ça aide quelqu'un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X