何时使用Enum / Int常量

我有一个问题,我们应该什么时候使用Enum,什么时候应该使用最终的常量?

我知道它已经在Enums和Constants上讨论过了。 哪个使用时? 尽管这是C#的问题。

我的问题是为什么Android使用如此多的常量而不是Enum? 例如,上下文

在我看来,如果我们使用常量,可能存在以下风险:如果我们定义一个LEVEL常量,

 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可以解决这个问题,尽管它可能会导致更多的开销,因为它是Object。

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


这与android历史有关。 在Froyo之前的版本中有未确认的性能问题。 建议不要使用开发者的枚举。 由于Froyo性能设计文档按照此处所述进行了重写。

正如您可能已经注意到的那样,我们重写了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更多的内存资源。

要回答你的问题,必须理解枚举的作用。 枚举的一个作用是增加编译时类型的安全性。

要指出,看看这个例子:

public void setImportantThing(int priviledge, int rights)

public void setImportantThing(Privilege p, Right r)

int的情况下,我们可以传递任何一个int值。 在enum我们被迫使用正确的一个。

我们这里的情况是在编译时间验证和运行时内存使用之间进行折衷。 你应该自己决定什么时候应该使用enum以及static int是否足够安全。

注意:枚举是在1.5版本中引入Java的,在使用它们之前,这是相当有问题的。

在Android Studio Beta中,开发人员将能够使用注释强制执行类型安全。


枚举是:

  • 更安全 - 更易于改变。

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

  • 更清晰 - 大多数开发人员会立即明白项目以某种方式连接。

    enum { A, B, C }更明显是一组连接比psfi A = 0; psfi B = 1; psfi C = 2; psfi A = 0; psfi B = 1; psfi C = 2;

  • 所以,除非你有使用public static final int可衡量的优势,不管是在内存占用还是速度上,你都应该使用enum

    请参阅何时优化过早?


    基本上Android核心是C / C ++代码。 这适用于整数。 所以当在Java中使用枚举时,每个值都必须被“翻译”。 这会花费CPU时间和内存。 两者在嵌入式系统上都很少见。

    链接地址: http://www.djcxy.com/p/39577.html

    上一篇: When to use Enum / Int Constants

    下一篇: Priorities for writing code