我差不多完成了一个计算活动,我正在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)
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应用程序是您应该保持尽可能轻量级以获得流畅的用户体验.每一寸的性能都很重要!
Nac*_*oma 21
正如Chris所评论的那样,枚举在Android上需要更多内存,因为它们随处可见.您应该尝试使用IntDef或StringDef,它使用注释以便编译器验证传递的值.
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中的默认优化之一.
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
| 归档时间: |
|
| 查看次数: |
138677 次 |
| 最近记录: |