Android:枚举vs静态最终ints?

在Java Android应用程序中拥有一组enumstatic final int有什么优势(或缺点)? 有没有效率或性能优化发生,赞成使用其中之一?

我问这个意图requestCodes和这样的情况下 – 这往往是在Android示例代码整数,而不是从一个枚举的值,我曾经在C.

Solutions Collecting From Web of "Android:枚举vs静态最终ints?"

从这个问题的枚举优点:

  • 它们比整数,string或布尔标志组更安全得多。
  • 他们导致更可读的代码。
  • 将枚举设置为无效值比int或string更困难。
  • 他们可以很容易地发现variables或参数的允许值。
  • 我读过的所有东西都表明它们在C#和大多数JVM中的performance与整数一样好。

我会补充一点:

  • 枚举可以有成员和实例variables,而int不能。

像大多数抽象一样,一旦performance突出 ,它们一般都是绝对有利的。 特别是在你的应用程序代码(而不是框架代码),我会select枚举模拟它们的其他方法。

个人经验的一个非常简单的答案是,枚举提供了更好的types安全性,换句话说,编译器在保持你的代码没有bug方面起到了更积极的作用。

另一方面,因为引子是对象世界的“二等公民”,所以在现今常用的一些更微妙的devise模式中,尤其是涉及generics时,可能难以使用它们。

最后,你可以在一个位域使用静态最后的整数。 你不能用enum做下面的事情:

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

整合枚举的一个优点是在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 } } 

我写了这个可怜的代码。 审查devise模式,四人帮使用int。 我试图在这里恢复。