Enum vs. Static Constants, empreinte mémoire

Consultez d'abord le devis suivant du guide du développeur Android:

En dépit de l'avertissement sinistre dans le premier point de balle pour "éviter strictement l'utilisation d'énigmes sur Android", ce qui se dit sous ce point ne semble pas vraiment mal. Les constantes sont des nombres entiers de 32 bits, et les énumérations sont probablement des références de 64 bits. Les calculs donnés là où les énigmes sont deux fois plus coûteux ont un sens et ne semblent pas si effrayants.

Je crains que l'avertissement, en partie, soit basé sur le deuxième point de balle.

Je me demande si une simple déclaration de "classe" comporte des frais généraux de 500 octets? En savoir plus sur eacn enum type?

Il semble tout à fait plausible que les types puissent être des «classes étendues» car ils peuvent prendre leurs propres méthodes plutôt que des exemples. Pour l'énumérer comme une question, si mon énomètre est Couleur, et j'ai 20 types d'énumération de couleur (p. Ex. Rouge, bleu, vert …), est-ce que 500 octets par type?

2 Solutions collect form web for “Enum vs. Static Constants, empreinte mémoire”

Les énoncés sont un débat infini permanent dans le monde Android.

Vous pouvez entendre parler de Romain Guy et Chet Haase ici: http://www.parleys.com/play/5298f999e4b039ad2298c9e3/chapter57/about

Selon cette vidéo, quel est l'importance d'un objet dans Dalvik peut être calculé comme suit:

overhead of Object + overhead of dlmalloc + data + align 
  • La surcharge d'un objet est exactement 8 octets.
  • La surcharge de dlmalloc peut être de 4 à 8 octets (la plupart du temps est de 8 octets)
  • La taille des données dépend des données (bien sûr)
  • Enfin, tout doit être aligné de 8 octets (par exemple, si vous avez 12 octets pour un objet, cela prendra 16 octets)

N'oubliez pas de garder à l'esprit que chaque valeur d'un énoncé est en fait une instance d'une classe Enum.

Un autre point important à garder à l'esprit est la taille du fichier dex. Par exemple, l'énumération suivante prend environ 1 121 octets

 public static enum Things { THING_1, THING_2; }; 

Ou vous pouvez avoir deux int statique qui prendra 128 octets.

 public static int THING_1 = 1; public static int THING_2 = 2; 

Vous avez une amélioration de 10 fois dans la taille du fichier dex.

Il existe également une grande différence quant à la quantité de code dalvik compilé généré. Pour Enum, il y a beaucoup de choses que le compilateur fait pour vous. Il y a une initialisation de classe statique la première fois que la classe est chargée au moment de l'exécution. Il ajoute des heures supplémentaires au démarrage.

D'autre part, énumerez également beaucoup de pros: lisibilité, facilité d'utilisation, code sécurisé. Je ne m'inquiéterais pas seulement des cas extrêmes particuliers.

Surtout quand on considère que l'utilisation de ProGuard peut optimiser Enums en les transformant en constantes normales d'int.

Vous êtes manqué, lisez le message.

Vous citez

Every class in Java (including anonymous inner classes) uses about 500 bytes of code.

Faites remarquer que vous devez stocker la définition de la classe à un endroit donné et qui prend 500 octets.

Cela signifie qu'il n'y a pas de différence entre enum Const {} et la class Const{} .

Ce qui est plus important, c'est la quantité de mémoire que les objets consomment lorsqu'une instance est créée.

Every class instance has 12-16 bytes of RAM overhead. – source de la ligne suivante.

Pour résumer ceci. Vous pouvez bénéficier des constantes de formulaire sous forme de valeur int uniquement lorsqu'elles sont déclarées parmi un même conteneur long (énumération ou classe).

En réalité, enum est également une classe qui étend le type Enum<?> , Et une instance nécessite plus de mémoire que static int constant.

Ce que vous échangez ici, c'est la consommation de mémoire et tapez le code sécurisé. Lorsque vous utilisez l'int comme constant, vous ne pouvez pas assurer la sécurité du type.

public void doAction(int what) {}

public void doAction(What what) {}

Sur les appareils modernes, vous pouvez coder pour consommer plus de mémoire. Mais pour certains aspects de votre code, il est plus facile d'utiliser l'int pour d'autres énums est le bon choix. Ceci est particulièrement visible sur le paquet androind R où la quantité de code est significative.

Dans ce cas, vous devriez utiliser int pour les champs de domaine de petite taille. Enum sont plus sécurisés.

coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.