Ich bin fast fertig mit einer Berechnungsaktivität, mit der ich in Android für meine App arbeite. Ich versuche, ein Gender Enum zu erstellen, aber aus irgendeinem Grund immer Syntaxfehler, fügen Sie “EnumBody” ein, um EnumDeclaration abzuschließen.
public static enum Gender
{
static
{
Female = new Gender("Female", 1);
Gender[] arrayOfGender = new Gender[2];
arrayOfGender[0] = Male;
arrayOfGender[1] = Female;
ENUM$VALUES = arrayOfGender;
}
}
Ich habe es auch ohne das statische {} versucht, aber ich bekomme den gleichen Syntaxfehler.
Aufzählungen werden aus Leistungsgründen nicht empfohlen, verwenden Sie stattdessen primitive Konstanten. youtube.com/watch?v=Hzs6OBcvNQE
– Myke Dev
16. Oktober 2015 um 19:43 Uhr
UPDATE 2019: Enums können in Android problemlos verwendet werden, da ART DALVIK als Laufzeitumgebung ersetzt hat stackoverflow.com/a/56296746/4213436. Daher denke ich, dass die meisten Antworten in diesem Thread irrelevant sind.
– JDenais
20. September 2019 um 8:20 Uhr
@JDenais natürlich meinst du den Thread, auf den du gerade verwiesen hast
– YoussefDir
9. April 2020 um 17:31 Uhr
Spitig
Wo um alles in der Welt hast du diese Syntax gefunden? Java-Enums sind sehr einfach, Sie geben nur die Werte an.
public enum Gender {
MALE,
FEMALE
}
Wenn Sie möchten, dass sie komplexer sind, können Sie ihnen Werte wie folgt hinzufügen.
public enum Gender {
MALE("Male", 0),
FEMALE("Female", 1);
private String stringValue;
private int intValue;
private Gender(String toString, int value) {
stringValue = toString;
intValue = value;
}
@Override
public String toString() {
return stringValue;
}
}
Um die Aufzählung zu verwenden, würden Sie dann etwa so vorgehen:
Gender me = Gender.MALE
Ich werde es versuchen, ich sagte, ich sei ein absoluter Anfänger
– JMSDEV
12. Februar 2012 um 7:02 Uhr
Sorry, das meinte ich nicht negativ. Einfach die seltsamste Syntax, die ich je für eine Enum gesehen habe
– Spitzfindig
12. Februar 2012 um 7:15 Uhr
Es ist auch hilfreich zu erwähnen, dass Aufzählungen sequentiell sind, sodass Sie .ordinal() für die Aufzählung verwenden können, um den int-Wert zu erhalten.
– Kalel Wade
25. April 2014 um 20:24 Uhr
Die Syntax in der Frage ist die Art, die man sich bei der Verwendung eines Decompilers ausdenken könnte.
– Dan Getz
8. Juni 2016 um 20:26 Uhr
Ich habe so viel gelacht bei “Wo um alles in der Welt hast du diese Syntax gefunden” . Sagen wie ein Lehrer zu seinem Schüler
– Zar E. Ahmer
10. August 2016 um 7:34 Uhr
Es gab einige Diskussionen um diesen Streitpunkt, aber selbst in den neuesten Dokumenten deutet Android an, dass es keine so gute Idee ist, Enums in einer Android-Anwendung zu verwenden. Der Grund dafür ist, dass sie mehr Speicher verbrauchen als eine statische Konstantenvariable. Hier ist ein Dokument von einer Seite aus dem Jahr 2014, das von der Verwendung von Enums in einer Android-Anwendung abrät. http://developer.android.com/training/articles/memory.html#Overhead
Ich zitiere:
Beachten Sie den Speicher-Overhead
Informieren Sie sich über die Kosten und den Aufwand der von Ihnen verwendeten Sprache und Bibliotheken und berücksichtigen Sie diese Informationen beim Entwerfen Ihrer App von Anfang bis Ende. Oft haben Dinge, die auf der Oberfläche harmlos aussehen, in Wirklichkeit einen großen Overhead. Beispiele beinhalten:
Aufzählungen benötigen oft mehr als doppelt so viel Speicher wie statische Konstanten. Auf die Verwendung von Enums auf Android sollte unbedingt verzichtet werden.
Jede Klasse in Java (einschließlich anonymer innerer Klassen) verwendet etwa 500 Byte Code.
Jede Klasseninstanz hat 12–16 Byte RAM-Overhead.
Das Einfügen eines einzelnen Eintrags in eine HashMap erfordert die Zuordnung eines zusätzlichen Eintragsobjekts, das 32 Bytes benötigt (siehe den vorherigen Abschnitt über optimierte Datencontainer).
Ein paar Bytes hier und da summieren sich schnell – App-Designs, die klassen- oder objektlastig sind, werden unter diesem Overhead leiden. Das kann Sie in die schwierige Lage bringen, sich eine Heap-Analyse anzusehen und zu erkennen, dass Ihr Problem darin besteht, dass viele kleine Objekte Ihren Arbeitsspeicher verbrauchen.
Es gab einige Stellen, an denen sie sagten, dass diese Tipps veraltet und nicht mehr wertvoll seien, aber der Grund, warum sie sie immer wieder wiederholen, muss sein, dass etwas Wahres daran ist. Das Schreiben einer Android-Anwendung ist etwas, das Sie für eine reibungslose Benutzererfahrung so leicht wie möglich halten sollten. Und jeder Zentimeter Leistung zählt!
Es hat einige Orte gegeben – Könnten Sie einige hinzufügen, wenn Sie sie kennen? weil ich keine finde
– Krzysztof Skrzynecki
22. April 2015 um 15:07 Uhr
Hier ist jemandem aufgefallen, dass Informationen zur Verwendung von Ints anstelle von Enums aus entfernt wurden Leistungstipps in amtlichen Unterlagen. Außerdem habe ich recherchiert und gepostet Zusammenfassung auf reddit
Leute, meine Frage ist, ob Enum eine “schlechte” Praxis ist, warum unterstützt Google diese Funktion von Java immer noch mit Android? 🙁
– Jesus Castro
6. November 2015 um 23:01 Uhr
@JesúsCastro Weil Google sicherstellen möchte, dass Unternehmen mit viel vorhandener Java-Geschäftslogik (die möglicherweise Aufzählungen verwendet) ihre Bibliothek einfach in ein Android-Projekt einfügen und loslegen können.
– David Braun
28. Januar 2016 um 16:36 Uhr
Nacho Coloma
Wie von Chris kommentiert, benötigen Enums auf Android viel mehr Speicher, der sich summiert, wenn sie überall verwendet werden. Du solltest es versuchen IntDef oder StringDef stattdessen, die Anmerkungen verwenden, damit der Compiler übergebene Werte validiert.
public abstract class ActionBar {
...
@IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
@Retention(RetentionPolicy.SOURCE)
public @interface NavigationMode {}
public static final int NAVIGATION_MODE_STANDARD = 0;
public static final int NAVIGATION_MODE_LIST = 1;
public static final int NAVIGATION_MODE_TABS = 2;
@NavigationMode
public abstract int getNavigationMode();
public abstract void setNavigationMode(@NavigationMode int mode);
Sie können auch als Flags verwendet werden, was eine binäre Zusammensetzung (ODER-/UND-Operationen) ermöglicht.
BEARBEITEN: Es scheint, dass die Umwandlung von Enums in Ints eine der Standardoptimierungen in Proguard ist.
Ich platziere gerne int-Konstanten direkt in der Anmerkungsklasse. Es sieht also wie eine normale Aufzählung aus. Ich habe es hier beschrieben: blog.shamanland.com/2016/02/int-string-enum.html
– Oleksi K.
7. Februar 2016 um 14:30 Uhr
public enum Gender {
MALE,
FEMALE
}
Demzufolge Video Wenn Sie den ProGuard verwenden, brauchen Sie nicht einmal an Enums-Leistungsprobleme zu denken!!
Proguard kann in vielen Situationen Enums in Ihrem Namen zu INT-Werten optimieren, sodass Sie wirklich nicht darüber nachdenken oder arbeiten müssen.
Anm
Der bevorzugte Ansatz von Android sind int-Konstanten, die mit @IntDef erzwungen werden:
public static final int GENDER_MALE = 1;
public static final int GENDER_FEMALE = 2;
@Retention(RetentionPolicy.SOURCE)
@IntDef ({GENDER_MALE, GENDER_FEMALE})
public @interface Gender{}
// Example usage...
void exampleFunc(@Gender int gender) {
switch(gender) {
case GENDER_MALE:
break;
case GENDER_FEMALE:
// TODO
break;
}
}
Aufzählungen werden aus Leistungsgründen nicht empfohlen, verwenden Sie stattdessen primitive Konstanten. youtube.com/watch?v=Hzs6OBcvNQE
– Myke Dev
16. Oktober 2015 um 19:43 Uhr
UPDATE 2019: Enums können in Android problemlos verwendet werden, da ART DALVIK als Laufzeitumgebung ersetzt hat stackoverflow.com/a/56296746/4213436. Daher denke ich, dass die meisten Antworten in diesem Thread irrelevant sind.
– JDenais
20. September 2019 um 8:20 Uhr
@JDenais natürlich meinst du den Thread, auf den du gerade verwiesen hast
– YoussefDir
9. April 2020 um 17:31 Uhr