Arbeiten mit Enums in Android

Lesezeit: 5 Minuten

Benutzer-Avatar
JMSDEV

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

Benutzer-Avatar
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

    – Krzysztof Skrzynecki

    23. April 2015 um 8:34 Uhr

  • Android-Leistungsmuster: Der Preis von ENUMs (100 Tage Google Dev)

    – Afriza N. Arief

    4. November 2015 um 6:56 Uhr


  • 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

Benutzer-Avatar
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.

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.

Benutzer-Avatar
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;
  }
}

Dokumente: https://developer.android.com/studio/write/annotations.html#enum-annotations

1333840cookie-checkArbeiten mit Enums in Android

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy