2016-01-04 7 views
12

Ich weiß, dass beim Vergleich von Konstanten mit Enums Konstanten weniger Platz einnehmen und kann primitiv sein. Ich forsche @Intdef annotation in Android und kann mir jemand sagen, wenn es ein besserer Speicher ist, @Intdef vs ein Enum zu verwenden. Ist es jetzt in Android empfohlen, enum beiseite zu legen und @intdef nach vorne zu bewegen, wenn möglich? Kann @Intdef Polymorphismus tun, bezweifle ich?enum vs android @Intdef - welche ist besser optimiert

aus dem Android-Dokumentation in Bezug auf Speicher overhead:

Aufzählungen erfordern oft mehr als doppelt so viel Speicher wie statische Konstanten. Sie sollten strikt vermeiden, Enums auf Android zu verwenden.

Antwort

18

@Intdef ist deutlich effizienter, es trägt Nullgewicht über nur statische endgültige ints hat, ist es Zeit Anweisungen kompilieren. Enums sind Klassen und wie in Ihrem Link erwähnt, haben Sie einen Fußabdruck. @Intdef liefert Ihnen die grundlegendsten Funktionen von enums, nämlich value validation und keine der anderen Features von enums wie automatische String-Konvertierungen.

Ein Großteil der Android Docs ist abgestanden, dies könnte einer von ihnen sein. In den frühen Tagen von Android hat jedes Bit gezählt, aber jetzt Geräte sind viel fähiger. Persönlich würde ich zwischen diesen beiden Optionen wählen, je nachdem, was vom Design gefordert wird und nicht zu sehr davon überrascht werden, effizient zu sein. Auch die Syntax für einige dieser fortgeschritteneren Annotationen macht keinen sauber lesbaren Code, also kein Fan. Wenn die Situation jedoch gute alte statische Ints erfordert, wird der @Intdef Ihnen etwas Schutz auf Kosten von visuellem Durcheinander kaufen.

+4

Werfen Sie einen Blick auf die Proguard-Optimierungen 'class/unboxing/enum'. http://proguard.sourceforge.net/manual/optimizations.html –

10

Neben früheren Antworten möchte ich hinzufügen, dass, wenn Sie Proguard verwenden (und Sie sollten es auf jeden Fall tun Größe zu reduzieren und Ihren Code verschleiern), dann Enums automatisch auf @IntDef umgewandelt werden, wo immer es möglich ist:

https://www.guardsquare.com/en/proguard/manual/optimizations

Klasse/Unboxing/enum

vereinfacht Aufzählungstypen Konstanten auf ganzzahlige, wann immer möglich.

Deshalb, wenn Sie einige diskrete Werte haben und einige Methode sollte nur diese Werte zu übernehmen lassen und andere nicht von der gleichen Art, dann würde ich Enum verwenden, da Proguard diese manuelle Arbeit zu optimieren Code machen für mich .

Und here is ein guter Beitrag über die Verwendung von Enums von Jake Wharton, werfen Sie einen Blick darauf.

Als Bibliotheksentwickler erkenne ich diese kleinen Optimierungen, die vorgenommen werden sollten, da wir die Größe, den Speicher und die Leistung der konsumierenden App so wenig wie möglich beeinflussen wollen. Aber es ist wichtig zu wissen, dass eine Iterator-Zuweisung im Gegensatz zu einer indizierten Schleife mit einer HashMap-Datei oder einer binär gesuchten Sammlung wie SparseArray weggeworfen wird und eine Aufzählung in Ihren öffentlichen API-Werten im Vergleich zu ganzzahligen Werten vorgenommen wird. Es ist wichtig, den Unterschied zu kennen, um fundierte Entscheidungen zu treffen, und das Video macht fast einen Fehler, abgesehen von diesem dummen Stat.

+0

Obwohl natürlich "wann immer möglich" nicht so viel bedeutet. –

+0

Wenn ich mich nicht irre, konvertiert es alle "einfachen" enums. Wenn Sie Felder oder Methoden in einer Enumeration haben, wird diese nicht konvertiert. Ich kann die Verbindung mit dieser Beschreibung nicht finden, aber es klingt vernünftig. – Gaket