Android:enum vs static final int?

Cub*_*bic 31 java enums android

在Java Android应用程序中enum拥有一组static final ints 有什么优点(或缺点)?是否存在有利于使用其中一种或另一种的效率或性能优化?

我在上下文中询问了这个请求代码等等 - 它往往是Android示例代码中的内容,而不是我在C中习惯的枚举值.

Mat*_*lis 29

Enum从这个问题中获益:

  • 它们比整数,字符串或布尔标志集更加类型安全.
  • 它们导致更易读的代码.
  • 将枚举设置为无效值比使用int或string更困难.
  • 它们可以轻松发现变量或参数的允许值.
  • 我读过的所有内容都表明它们在C#和大多数JVM中的表现与整数一样好.

我想补充一下:

  • 枚举可以有成员变量和实例变量,而int不能.

像大多数抽象一样,一旦他们的表现赶上,它们通常是非常有利的.特别是在您的应用程序代码(而不是框架代码)中,我会选择枚举而不是其他模拟它们的方法.


Nic*_*ick 12

从个人经验中得出的一个非常简单的答案是,Enums提供了更好的类型安全性,换句话说,编译器可以在保持代码bug免费方面发挥更积极的作用.

另一方面,因为Enums是对象世界的"二等公民",所以它们很难用于当今常用的一些更微妙的设计模式,特别是涉及泛型时.

最后,您可以在位域中使用静态最终整数.你不能用枚举做以下事情:

int selectedOptions = Options.OPTION1 | Options.OPTION2 | Options.OPTION3;
Run Code Online (Sandbox Code Playgroud)

  • 在最后一部分,使用EnumSet是推荐的方法.我从来都不喜欢比特旗帜图案. (6认同)

Che*_*rra 7

嗯......根据一个秃头男人的说法,Enums 真的很难记忆.

你应该使用@ 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 {}
Run Code Online (Sandbox Code Playgroud)

然后

@NavigationMode
public abstract int getNavigationMode();

public abstract void setNavigationMode(@NavigationMode int mode);
Run Code Online (Sandbox Code Playgroud)