Frage Warum verwendet Android nicht mehr Enums?


Ich habe angefangen, C # und Java-Enums in meinem Code zu verwenden, und zwar aus verschiedenen Gründen:

  • Sie sind viel typsicherer als Integer, Strings oder Boolesche Flags.
  • Sie führen zu besser lesbarem Code.
  • Es ist schwieriger, eine Aufzählung auf einen ungültigen Wert als ein int oder eine Zeichenfolge festzulegen.
  • Sie erleichtern das Ermitteln der zulässigen Werte für eine Variable oder einen Parameter.
  • Alles, was ich gelesen habe, zeigt an, dass sie genauso gut sind wie Integer in C # und den meisten JVMs.

Das Android-Framework hat jedoch zahlreiche Fälle, in denen Flags verschiedener Typen weitergegeben werden müssen, aber keine von ihnen scheint enums zu verwenden. Ein paar Beispiele, bei denen ich denke, dass ihre Verwendung von Vorteil wäre, sind Toast.LENGTH_SHORT / Toast.LENGTH_LONG und View.GONE, View.VISIBLE, etc.

Warum ist das? Sind Enums in Dalvik schlechter als einfache Integer-Werte? Gibt es einen anderen Nachteil, den ich nicht kenne?


76
2018-01-27 22:49


Ursprung


Antworten:


Diese Antwort ist im März 2011 veraltet. 

Enums können auf Froyo und auf - nach dieser Antwort (Warum wurde "Vermeiden Sie Enums, wo Sie nur brauchen" aus den Leistungstipps von Android entfernt?) von einem Mitglied des Android VM Teams (und sein Blog).


Vorherige Antwort:

Die offizielle Empfehlung des Android-Teams besteht darin, Enums zu vermeiden, wann immer Sie es vermeiden können:

Enums sind sehr praktisch, aber   Leider kann es bei der Größe schmerzhaft sein   und Schnelligkeit. Zum Beispiel:

public enum Shrubbery { GROUND, CRAWLING, HANGING }

fügt 740 Bytes hinzu   Ihre .dex-Datei im Vergleich zur   gleichwertige Klasse mit drei öffentlichen   statische finale Ints. Bei der ersten Verwendung der   Klasseninitialisierer ruft den Befehl auf   Methode für Objekte, die jedes von   die aufgezählten Werte. Jedes Objekt   bekommt sein eigenes statisches Feld, und das   Der vollständige Satz wird in einem Array gespeichert (a   statisches Feld namens "$ VALUES"). Das ist   eine Menge Code und Daten, nur für drei   ganze Zahlen. Zusätzlich dazu:

Shrubbery shrub = Shrubbery.GROUND;

verursacht eine statische Feldsuche. Ob   "GROUND" war ein statisches Finale, das   Compiler würde es als bekannt behandeln   konstant und inline es.

Quelle: Vermeiden Sie Aufzählungen, bei denen Sie nur Einfügungen benötigen


64
2018-01-27 22:53



Ganzzahlen sind kleiner und benötigen weniger Overhead, was auf mobilen Geräten immer noch zählt.


13
2018-01-27 22:52



Ein Kollege von mir führte einen kleinen Test in dieser Situation durch. Er hat automatisch einen generiert class und ein enum mit der gleichen Menge an "enums". Ich glaube, er hat 30000 Einträge generiert.

Die Ergebnisse waren:

  • .class für die class war ungefähr 1200KB
  • .class für die enum war ungefähr 800KB

Hoffe, das hilft jemandem.


5
2018-05-09 19:37