TLDR : Dalvik n'était pas très bon en matière d'allocation de mémoire et de Enum
utilise plus de mémoire que int
. Android Lollipop a remplacé Dalvik par ART qui ne souffre pas des mêmes limitations. Cette recommandation n'est donc plus d'actualité.
La réponse longue :
Wow ! 8 ans, 5 réponses et de nombreux commentaires plus tard, la vraie raison n'est toujours pas abordée.
À l'époque d'Android pré-lollipop, Dalvik était le processus VM utilisé. Comme les applications disposaient alors d'une faible quantité de mémoire, Dalvik était soumis à de nombreuses contraintes de mémoire. Pour l'allocation de mémoire, Dalvik devait parcourir le tas et trouver de l'espace. Le tas se fragmentait également au fil du temps. Dalvik ne pouvait pas défragmenter, il allouait donc la mémoire au fil du temps et finissait par manquer d'espace.
Évitez les Enums lorsque vous n'avez besoin que d'Ints
provient des jours Dalvik car un Enum
est beaucoup plus grand qu'un int
et l'allocation de mémoire était très coûteuse.
Aujourd'hui, Dalvik a été remplacé par ART. ART est apparu dans KitKat et est par défaut depuis Lollipop.
ART a été créé dès le départ non pas pour optimiser la mémoire, mais pour optimiser les performances. Il est également optimisé pour les allocations et les collections. En effet, il dispose d'une mémoire réservée aux objets volumineux. Au lieu de tout mettre dans le même tas, et de devoir ensuite trouver de la place pour les gros objets parmi tous les petits, ART place tous les gros objets et les bitmaps dans un tas séparé. Les petits objets sont ensuite placés dans ce même tas. Il peut également défragmenter.
Après ART, si vous utilisez Enum
Android s'en moque et c'est pourquoi la recommandation a disparu.
Cette information provient de Chet Haase, de Google. Je recommande de trouver sa présentation à la conférence Google I/O et de regarder la vidéo en entier. Elle contient beaucoup d'informations utiles et une vision d'Android.
0 votes
Excellente question, bien repérée. J'ai évité d'utiliser les enums dans mon code spécifiquement à cause de la recommandation de performance qui figurait dans les documents.
2 votes
Pour référence, voici le décompilé pour l'exemple Shrubbery : https://gist.github.com/847418
15 votes
En mars 2014, la page suivante contient toujours des conseils contre l'utilisation des enums : developer.Android.com/training/articles/memory.html#Overhead
2 votes
Un an plus tard, comme l'a dit @TahirAkhtar, la formation officielle d'Android dit toujours "You should strictly avoid using enums on Android".
1 votes
Il est intéressant de noter que la recommandation d'éviter les énumérations se trouve dans cet article de 2015 d'un développeur Android de premier plan : medium.com/google-developers/ En outre : "Notez que l'utilisation de l'annotation @IntDef, qui est prise en charge par Android Studio et Gradle 1.3+, donnera à votre code une sécurité de type à la construction (lorsque les erreurs lint sont activées), tout en conservant les avantages en termes de taille et de performance de l'utilisation de variables int."
4 votes
Depuis avril 2018, la page suivante ne contient plus de conseils contre l'utilisation des enums. developer.Android.com/topic/performance/memory#Overhead