在Java Android应用程序中,拥有一个enum
相对于一组static final int
的优点(或缺点)是什么?是否存在有利于使用其中一种的效率或性能优化?
我在这个问题中问的是像意图请求代码等上下文 - 在Android示例代码中往往是int类型,而不是来自枚举的值,这与我在C中所习惯的不同。
在Java Android应用程序中,拥有一个enum
相对于一组static final int
的优点(或缺点)是什么?是否存在有利于使用其中一种的效率或性能优化?
我在这个问题中问的是像意图请求代码等上下文 - 在Android示例代码中往往是int类型,而不是来自枚举的值,这与我在C中所习惯的不同。
个人经验得出的非常简单的答案是,枚举类型提供了更好的类型安全性,或者说编译器在保持代码无错方面扮演了更积极的角色。
另一方面,由于枚举类型在对象世界中是“二等公民”,所以在一些更微妙的设计模式中,特别是涉及到泛型时,它们可能很难使用。
最后,你可以在位域中使用静态final整数。 不能通过枚举类型实现以下操作:
int selectedOptions = Options.OPTION1 | Options.OPTION2 | Options.OPTION3;
你应该使用@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);
整数类型相对于枚举类型的一个优势在于类工厂。下面的 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。我尝试在这里找回它。