Java 何时使用枚举/整数常量

Java 何时使用枚举/整数常量,java,android,enums,constants,Java,Android,Enums,Constants,我有一个问题,我们什么时候应该使用Enum,什么时候应该使用final常量 我知道,虽然这是一个C#问题,但它已经在会议上讨论过了 我的问题是为什么Android使用这么多常量而不是枚举?例如 我认为,如果我们使用常数,可能存在以下风险: 如果我们定义一个水平常数 public static final int LEVEL_LOW=1; public static final int LEVEL_MEDIUM=2; public static final int LEVEL_HIGH=3

我有一个问题,我们什么时候应该使用Enum,什么时候应该使用final常量

我知道,虽然这是一个C#问题,但它已经在会议上讨论过了

我的问题是为什么Android使用这么多常量而不是枚举?例如

我认为,如果我们使用常数,可能存在以下风险: 如果我们定义一个水平常数

 public static final int LEVEL_LOW=1;
 public static final int LEVEL_MEDIUM=2;
 public static final int LEVEL_HIGH=3;
当我们传递int=4的参数时。它不会有编译错误,如果我们传递一个数字1,代码读者可能不容易知道它的意思

但Enum可以解决这个问题,尽管它可能会导致更多的开销,因为它是对象

那么为什么Android使用常量而不是枚举呢?
在这种情况下,我们什么时候应该使用常量或枚举,这有什么原则吗?

当我个人编程时,当我想让一个名称代表一个重要的整数时,我会使用上面的方法。例如,MAX_INT可以映射到INT 50。这是很有用的,因为如果我愿意,我可以将int改为60,而不必遍历所有代码,将50改为60


对于枚举,它是(正如所解释的)一种特殊的数据类型,使变量成为一组预定义的常量。因此,如果您希望有一组有限的值可供选择,这将是一个理想的选择,而您上面选择的样式将是可扩展的,并且如上所述,通过选择一个不在边界内的值很容易利用。

基本上安卓核心是C/C++代码。这适用于整数。因此,在Java中使用枚举时,必须“转换”每个值。这将消耗CPU时间和内存。两者在嵌入式系统上都很少见。

这与android的历史有关。Froyo之前的版本中存在未经确认的性能问题。开发人员建议不要使用enum。自Froyo以来,性能设计文档已按所述重写

正如您可能已经注意到的,我们重新编写了性能设计 弗罗约的文件。以前,这是一堆可能 在某一点上是正确的,但早已不再有任何意义 与现实的关系。在Froyo中,文档中的每一项索赔 有一个基准来证明(或在未来反驳)它。你 可以在浏览器中阅读“为性能而设计”基准测试

但改变遗留内容的结构毫无意义

性能可能与需要存储字符串有关。为每个常量创建单个类与为多个枚举创建单个类之间存在显著差异

例如,在Java 7中,当您有一个包含两个字段的枚举时,轮询常量中需要44项,而对于一个包含两个静态最终整数的类,您只需要17项

有什么区别

class ContantField {
  public static final int f1 = 0;
  public static final int f2 = 1;
}

enum ContantEnum {
  E1,E2
}
这两个声明在存储和使用方式上非常不同。
ContantEnum
的简化如下

class ContantEnum {
   public static final Enum enum0    = new Enum("V1",0);
   public static final Enum enum1    = new Enum("V2",1);
   public static final Enum[] values = new Enum[] {enum0,enum1};
} 
通过这种简化,您可以注意到
enum
int
需要更多的内存资源

要回答您的问题,必须了解枚举的作用。enum的一个作用是提高编译时类型的安全性

要指出这一点,请参见此示例:

public void setImportantThing(int priviledge, int rights)

public void setImportantThing(Privilege p, Right r)
int
的情况下,我们可以传递任何int值。在
enum
的情况下,我们必须使用正确的值

我们这里的例子是编译时验证和运行时内存使用之间的权衡。您应该自己决定何时使用
enum
以及
static int
在何处足够安全

注: enum是在1.5版中引入Java的,在这之前使用它们是很有问题的


在androidstudio测试版中,开发人员将能够使用注释强制执行类型安全

简单地说,枚举比公共静态最终字段使用更多的资源,所以不要在每个字节都计数的移动编程中使用枚举

枚举包括:

  • 更安全-更能适应变化

    如果更改错误,对枚举列表的更改更有可能导致编译时错误

  • 更清晰-大多数开发人员将立即了解到这些项是以某种方式连接的

    enum{A,B,C}
    psfia=0更明显地是一组具有连接的项;psfib=1;psfic=2

因此,除非使用
公共静态final int
具有可测量的优势,否则无论是内存占用还是速度,都应该始终使用
enum


请参见

如果要确保传递的是预定义常量的子集,则可以使用Enum。我自己也不知道这一点。我认为Android源代码根本不使用枚举。在代码中使用枚举。在Android中,许多值都是可以添加(或“ed”)的标志。除此之外,Android内核“相当古老”,所以可能是在Enum不是Java的一部分时开始开发的。除了嵌入式系统,Enum还需要更多内存。@jaskey wikipedia说Android始于2003年,Java5于2005年推出。除此之外,它的核心是C/C++,它可以处理numbers.imho,在处理一些低级api时使用整数,或者您的资源有限,您需要为每一个空闲kb而奋斗。否则,我认为最好使用枚举,它们可以防止方法接受无效数据,并提高可读性Java被转换为字节码。然后将字节码转换为dalvik字节码。Dalvik字节码通过Dalvik VM执行。枚举可以表示为整数。使用字符串的枚举上存在开销。更有可能的是,这就是原因。使用枚举时,不仅需要存储整数,还需要存储每个需要内存的枚举的整数值。Java不像C那样给枚举赋予数值。谢谢!这真是合情合理@布鲁姆方德尔。int不是