Ich habe eine Reihe verwandter Konstanten wie Bundle
Schlüssel zusammen in einer Schnittstelle wie der folgenden definiert:
public interface From{
String LOGIN_SCREEN = "LoginSCreen";
String NOTIFICATION = "Notification";
String WIDGET = "widget";
}
Dies bietet mir eine bessere Möglichkeit, verwandte Konstanten zu gruppieren und sie durch einen statischen Import (keine Implementierungen) zu verwenden. Ich weiß, dass Android
Framework die Konstanten auch auf die gleiche Weise verwendet wie Toast.LENTH_LONG
, View.GONE
.
Ich habe jedoch oft das Gefühl, dass dies Java Enums
eine viel bessere und leistungsfähigere Möglichkeit darstellt, die Konstante darzustellen.
Aber gibt es ein Leistungsproblem bei der Verwendung von enums
on Android
?
Mit ein wenig Recherche geriet ich in Verwirrung. Aus dieser Frage
? „Vermeiden Sie Aufzählungen , wo man nur Ints Need“ von Android Performance - Tipps entfernt ist es klar , dass Google
entfernt ‚Vermeiden Sie Aufzählungen‘ von seiner Leistung Tipps, aber von ihm offizielles Training docs ist Beachten Sie Speicher - Overhead Abschnitt sagt es deutlich: „Aufzählungen benötigen oft mehr als doppelt so viel Speicher wie statische Konstanten. Sie sollten die Verwendung von Enums unter Android unbedingt vermeiden. " Gilt dies immer noch? (Sagen wir in Java
Versionen nach 1.6)
Ein weiteres Problem , dass ich beobachtet wird, ist zu senden enums
über intents
Verwendung Bundle
ich sie durch Serialisierung senden (dh putSerializable()
, dass ich eine teuere Operation denke , im Vergleich zu primitiver putString()
Methode, obwohl enums
bietet es kostenlos).
Kann jemand bitte klären, auf welche Weise er am besten dargestellt werden kann Android
? Sollte ich die Verwendung von enums
on unbedingt vermeiden Android
?
Enum.ordinal()
stattdessen als int übergeben .Antworten:
Verwenden
enum
Sie diese Option, wenn Sie ihre Funktionen benötigen. Vermeiden Sie es nicht streng .Java-Enum ist leistungsfähiger, aber wenn Sie seine Funktionen nicht benötigen, verwenden Sie Konstanten, sie nehmen weniger Platz ein und können selbst primitiv sein.
Wann man enum benutzt:
Methodenüberladung - Jede Enum-Konstante hat ihre eigene Implementierung einer Methode
mehr Daten - Ihre eine Konstante enthält mehr als eine Information, die nicht in eine Variable eingefügt werden kann
Wann nicht enum verwenden:
Sie können fortlaufende Daten akzeptieren
Aufzählungen nehmen mehr Platz ein
Konstanten nehmen weniger Platz ein
quelle
Wenn die Aufzählungen nur Werte haben, sollten Sie versuchen, IntDef / StringDef zu verwenden, wie hier gezeigt:
https://developer.android.com/studio/write/annotations.html#enum-annotations
Beispiel: statt:
Sie nutzen:
und in der Funktion, die es als Parameter / Rückgabewert hat, verwenden Sie:
Wenn die Aufzählung komplex ist, verwenden Sie eine Aufzählung. Ist doch nicht so schlimm.
Um Aufzählungen mit konstanten Werten zu vergleichen, sollten Sie hier lesen:
Ihr Beispiel ist eine Aufzählung mit 2 Werten. Es dauert 1112 Bytes in der Dex-Datei im Vergleich zu 128 Bytes, wenn konstante Ganzzahlen verwendet werden. Sinnvoll, da Aufzählungen echte Klassen sind, im Gegensatz zu C / C ++.
quelle
IntDef
Anmerkung übergeben, wird dies der Fall sein. Was die Uhren betrifft, denke ich, dass es auch ziemlich klar ist. Welches Gerät hat mehr CPU-Leistung, RAM und Akku: ein Telefon oder eine Uhr? Und welche benötigen Software, um die Leistung zu optimieren?Zusätzlich zu früheren Antworten möchte ich hinzufügen, dass, wenn Sie Proguard verwenden (und dies auf jeden Fall tun sollten, um die Größe zu verringern und Ihren Code zu verschleiern), Ihr Code
Enums
automatisch konvertiert wird@IntDef
wo immer dies möglich ist:https://www.guardsquare.com/de/proguard/manual/optimizations
Wenn Sie also einige diskrete Werte haben und eine Methode es erlauben sollte, nur diese Werte und nicht andere des gleichen Typs zu verwenden, würde ich verwenden
Enum
, da Proguard diese manuelle Arbeit zur Optimierung des Codes für mich erledigt.Und hier ist ein guter Beitrag über die Verwendung von Enums von Jake Wharton.
quelle
Nein. " Streng " bedeutet, dass sie so schlecht sind, dass sie überhaupt nicht verwendet werden sollten. Möglicherweise können Leistungsprobleme in einer extremen Situation auftreten, wie z. B. vielen, vielen (Tausenden oder Millionen von) Operationen mit Aufzählungen (fortlaufend im UI-Thread). Weitaus häufiger sind die Netzwerk-E / A-Vorgänge, die unbedingt in einem Hintergrund-Thread ausgeführt werden sollten. Die häufigste Verwendung von Aufzählungen ist wahrscheinlich eine Art Typprüfung - ob es sich bei einem Objekt um dieses oder jenes handelt , das so schnell ist, dass Sie keinen Unterschied zwischen einem einzelnen Vergleich von Aufzählungen und einem Vergleich von Ganzzahlen feststellen können.
Hierfür gibt es keine allgemeine Faustregel. Verwenden Sie alles, was für Sie funktioniert, und helfen Sie Ihnen, Ihre App fertig zu machen. Später optimieren - nachdem Sie festgestellt haben, dass es einen Engpass gibt, der einige Aspekte Ihrer App verlangsamt.
quelle
Mit Android P hat Google keine Einschränkungen / Einwände bei der Verwendung von Aufzählungen
Die Dokumentation hat sich dort geändert, wo zuvor empfohlen wurde, vorsichtig zu sein, aber jetzt wird sie nicht erwähnt. https://developer.android.com/reference/java/lang/Enum
quelle
Zwei Fakten.
1, Enum ist eine der mächtigsten Funktionen in JAVA.
2, Android-Handy hat in der Regel viel Speicher.
Meine Antwort lautet also NEIN. Ich werde Enum in Android verwenden.
quelle
Ich möchte hinzufügen, dass Sie @Annotations nicht verwenden können, wenn Sie eine Liste <> oder Map <> deklarieren, bei der entweder der Schlüssel oder der Wert einer Ihrer Anmerkungsschnittstellen ist. Sie erhalten die Fehlermeldung "Anmerkungen sind hier nicht erlaubt".
Wenn Sie es also in eine Liste / Map packen müssen, verwenden Sie enum, da diese hinzugefügt werden können, @annotated int / string groups jedoch nicht.
quelle