在Android中使用枚举

我几乎完成了一个计算活动,我正在与Android的我的应用程序。 我尝试创build一个性别枚举,但出于某种原因得到语法错误,插入“EnumBody”来完成EnumDeclaration。

public static enum Gender { static { Female = new Gender("Female", 1); Gender[] arrayOfGender = new Gender[2]; arrayOfGender[0] = Male; arrayOfGender[1] = Female; ENUM$VALUES = arrayOfGender; } } 

我也试过没有静态{},但我得到相同的语法错误。

你到底在哪里find这个语法? Java枚举非常简单,只需指定值即可。

 public enum Gender { MALE, FEMALE } 

如果你希望它们更复杂,你可以像这样给它们添加值。

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

然后使用枚举,你会做这样的事情:

 Gender me = Gender.MALE 

围绕这个争论点已经有一些争论,但即使在最新的文档中,android也暗示在android应用程序中使用枚举不是一个好主意。 原因是因为它们比静态常量variables占用更多的内存。 这是2014年的一个页面的文档,build议不要在android应用程序中使用枚举。 http://developer.android.com/training/articles/memory.html#Overhead

我引用:

注意内存开销

了解您使用的语言和库的成本和开销,并在devise应用程序时从头到尾保留这些信息。 通常情况下,表面看起来无害的事实上可能会有大量的开销。 例子包括:

  • 枚举通常需要比静态常量多两倍的内存。 你应该严格避免在Android上使用枚举。

  • Java中的每个类(包括匿名内部类)使用大约500个字节的代码。

  • 每个类实例都有12-16字节的RAM开销。

  • 将单个条目放入HashMap需要分配一个额外的32个字节的条目对象(请参阅前面关于优化数据容器的部分)。

在这里和那里几个字节快速添加应用程序devise,类或对象很重的将遭受这种开销。 这可能会让您处于堆分析的困境,并意识到您的问题是使用RAM的很多小对象。

有些地方他们认为这些提示已经过时,不再有价值,但是他们不断重复的原因一定是有一定道理的。 编写一个android应用程序是你应该保持尽可能轻量级,以获得stream畅的用户体验。 而每一个小小的performance都很重要!

正如Chris所评论的那样,枚举在Android上需要更多的内存,随着它们在各处的不断使用而增加。 您应该尝试使用IntDef或StringDef ,它们使用注释以便编译器validation传递的值。

 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); 

它也可以用作标志,允许二进制组合(OR / AND操作)。

编辑 :看来,将枚举转换为整数是Proguard中的默认优化之一 。

 public enum Gender { MALE, FEMALE } 

根据这个video,如果你使用ProGuard,你甚至不需要考虑枚举性能问题!

Proguard可以在很多情况下将Enums优化为INT值,所以实际上不需要考虑它或做任何工作。

枚举不build议用于性能问题,请改用原始常量。 https://www.youtube.com/watch?v=Hzs6OBcvNQE

Android的首选方法是用@IntDef强制的int常量:

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

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