拥有enum
与在Java Android应用程序中拥有一组static final int
的优点(或缺点)是什么?是否存在有利于使用其中一种或哪种的效率或性能优化?
我在说意图请求代码的情况下问这个问题 - 它往往是Android示例代码中的内容,而不是我在C中习惯的枚举值。
答案 0 :(得分:29)
来自this question的枚举优势:
- 它们比整数,字符串或布尔集更加类型安全 标志。
- 它们会带来更易读的代码。
- 将枚举设置为无效值比使用int或更难更困难 字符串。
- 它们可以很容易地发现变量或变量的允许值 参数。
- 我读过的所有内容都表明它们的表现与整数一样好 在C#和大多数JVM中。
我想补充一下:
int
则不能。与大多数抽象一样,它们performance catches up一般具有明显的优势。特别是在你的应用程序代码中(而不是框架代码),我会选择枚举而不是其他模拟它们的方法。
答案 1 :(得分:12)
个人经验的一个非常简单的答案是,Enums提供了更好的类型安全性,换句话说,编译器可以在保持代码bug免费方面发挥更积极的作用。
另一方面,因为Enums是对象世界的“二等公民”,所以它们很难用于当今常用的一些更微妙的设计模式,特别是涉及泛型时。
最后,您可以在位域中使用静态最终整数。你不能用枚举来做以下事情:
int selectedOptions = Options.OPTION1 | Options.OPTION2 | Options.OPTION3;
答案 2 :(得分:7)
嗯......根据a bald guy枚举really bad for memory。
您应该使用@IntDef/@StringDef注释:
public static final int NAVIGATION_MODE_STANDARD = 0;
public static final int NAVIGATION_MODE_LIST = 1;
public static final int NAVIGATION_MODE_TABS = 2;
@IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
public @interface NavigationMode {}
然后
@NavigationMode
public abstract int getNavigationMode();
public abstract void setNavigationMode(@NavigationMode int mode);
答案 3 :(得分:3)
对枚举进行整数的一个优点是在CLASS FACTORY中。以下C#代码不可扩展:
class Factory
{
public enum DrawableType {CIRCLE,SQUARE};
public static Drawable GetInstance(DrawableEnum e)
{
if (e == DrawableType.CIRCLE)
{
return new Circle();
}
else if (e == DrawableType.SQUARE)
{
return new Square();
}
else
{
throw new IndexOutOfRangeException(); // should never get here
}
}
我写了这个糟糕的代码。回顾设计模式,四人一组使用了int。我试图恢复here。