在 android 中使用 Enums

我几乎完成了一个计算活动,我与我的应用程序在 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;
}
}

我也尝试过不使用 static {} ,但是得到了相同的语法错误。

170616 次浏览
public enum Gender {
MALE,
FEMALE
}

你到底是在哪里找到这种语法的? JavaEnums 非常简单,你只需要指定值。

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 应用程序中使用枚举并不是一个好主意。原因是它们比静态常量变量占用更多的内存。下面是2014年的一篇文章,建议不要在 android 应用程序中使用枚举。http://developer.android.com/training/articles/memory.html#Overhead

原话是:

注意内存开销

了解语言的成本和开销 使用的库,并在使用时记住这些信息 设计你的应用程序,从开始到结束。通常,表面上的东西 那些看起来无害的东西实际上可能有大量的开销。 例子包括:

  • 枚举所需的内存通常是静态枚举的两倍以上 应该严格避免在 Android 上使用枚举

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

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

  • 将单个条目放入 HashMap 需要分配 附加费 entry object that takes 32 bytes (see the previous section about 优化的数据容器)

这里几个字节,那里几个字节,快速添加 重类型或重对象的应用程序设计将受到影响 这可能会让你处于一个很困难的境地 堆分析和实现你的问题是很多小对象 耗尽了你的内存。

There has been some places where they say that these tips are outdated and no longer valuable, but the reason they keep repeating it, must be there is some truth to it. Writing an android application is something you should keep as lightweight as possible for a smooth user experience. And every little inch of performance counts!

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

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

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

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

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

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