首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在android中使用枚举

在android中使用枚举
EN

Stack Overflow用户
提问于 2012-02-12 14:27:13
回答 6查看 161.7K关注 0票数 124

我几乎完成了我在android中为我的应用程序处理的一个计算活动。我尝试创建一个性别枚举,但由于某种原因得到语法错误,插入"EnumBody“以完成EnumDeclaration。

代码语言:javascript
复制
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 {},但我得到了相同的语法错误。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-02-12 14:34:02

你到底是在哪里找到这个语法的?Java枚举非常简单,您只需指定值。

代码语言:javascript
复制
public enum Gender {
   MALE,
   FEMALE
}

如果你想让它们变得更复杂,你可以像这样给它们添加值。

代码语言:javascript
复制
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;
    }
}

然后,要使用枚举,您可以执行如下操作:

代码语言:javascript
复制
Gender me = Gender.MALE
票数 359
EN

Stack Overflow用户

发布于 2014-10-03 16:06:21

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

我引述如下:

注意内存开销

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

  • Enums通常需要的内存是静态常量的两倍多。你应该严格避免在Android.
  • Every类上使用枚举(包括匿名内部类)使用大约500字节的代码。
  • 每个类实例有12-16字节的内存开销。
  • 将单个条目放入HashMap中需要分配一个占用32字节的附加条目对象(请参见上一节中关于优化的data see的内容

这里或那里的几个字节很快就会累积起来--类或对象繁重的应用程序设计将受到这种开销的影响。这可能会让您在查看堆分析时陷入困境,并意识到您的问题是许多小对象占用了您的RAM。

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

票数 50
EN

Stack Overflow用户

发布于 2015-03-27 02:25:46

正如Chris评论的那样,枚举在Android上需要更多的内存,随着它们在任何地方的使用,这些内存都会增加。您应该尝试使用IntDefStringDef,它们使用注释,以便编译器验证传递的值。

代码语言:javascript
复制
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操作)。

编辑:似乎将枚举转换为It是one of the default optimizations in Proguard

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9246934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档