在android中使用Enums

JMS*_*DEV 115 enums android

我差不多完成了一个计算活动,我正在Android中为我的应用程序工作.我尝试创建一个性别枚举,但由于某些原因变得语法错误,插入"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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Spi*_*idy 330

你到底在哪里找到这种语法?Java Enum非常简单,您只需指定值即可.

public enum Gender {
   MALE,
   FEMALE
}
Run Code Online (Sandbox Code Playgroud)

如果您希望它们更复杂,您可以像这样向它们添加值.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Gender me = Gender.MALE
Run Code Online (Sandbox Code Playgroud)

  • 对不起,我的意思并不是那么消极.只是我见过的最简单的Enum语法 (85认同)
  • 我会尝试一下,我说我是一个绝对的初学者 (11认同)
  • 我笑了很多"你在哪里找到这种语法".对他的学生说就像老师一样 (9认同)
  • 它也有助于提及枚举顺序,因此您可以在枚举上使用.ordinal()来获取int值. (3认同)

Chr*_*ris 49

围绕这一争论点存在争议,但即使在最新的文档中,android也表明在Android应用程序中使用枚举并不是一个好主意.原因是因为它们比静态常量变量消耗更多内存.这是2014年页面中的一个文档,建议不要在Android应用程序中使用枚举.http://developer.android.com/training/articles/memory.html#Overhead

我引用:

注意内存开销

了解您正在使用的语言和库的成本和开销,并在设计应用程序时从头到尾记住这些信息.通常,表面看起来无害的东西实际上可能会产生大量开销.例子包括:

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

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

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

  • 将单个条目放入HashMap需要分配一个占用32个字节的附加条目对象(请参阅上一节关于优化数据容器的内容).

这里和那里的几个字节很快添加了类或对象重的应用程序设计将受到这种开销.这可能会使您处于查看堆分析的困难位置,并且意识到您的问题是许多小对象耗尽RAM.

有些地方他们说这些技巧已经过时且不再有价值,但他们不断重复的原因,必定是有一些道理.编写Android应用程序是您应该保持尽可能轻量级以获得流畅的用户体验.每一寸的性能都很重要!

  • [Here](http://stackoverflow.com/q/5143256/2004186)有人注意到从[性能提示](http://developer.android.com/training/articles/)中删除了有关使用in而不是枚举的信息.官方文档中的perf-tips.html#avoid_enums).此外,我做了研究并发布了[reddit摘要](http://redd.it/33hct2) (8认同)
  • @JesúsCastro因为Google希望确保拥有大量现有Java业务逻辑(可能使用枚举)的公司可以将他们的库放入Android项目中去. (5认同)

Nac*_*oma 21

正如Chris所评论的那样,枚举在Android上需要更多内存,因为它们随处可见.您应该尝试使用IntDefStringDef,它使用注释以便编译器验证传递的值.

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);
Run Code Online (Sandbox Code Playgroud)

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

编辑:似乎将枚举转换为整数是Proguard中的默认优化之一.

  • 我喜欢将int常量直接放入注释类.因此它看起来像常规枚举.我在这里描述了它:http://blog.shamanland.com/2016/02/int-string-enum.html (3认同)

Gab*_*gut 17

public enum Gender {
    MALE,
    FEMALE
}
Run Code Online (Sandbox Code Playgroud)


Han*_*ani 9

根据这个视频,如果您使用ProGuard,您甚至不需要考虑Enums的性能问题!

在许多情况下,Proguard可以代表您优化Enums到INT值,因此实际上不需要考虑它或做任何工作.


Anm*_*Anm 5

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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