何时使用枚举/整数常量

2022-09-03 05:57:11

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

我知道在枚举和常量中已经讨论过它。什么时候使用哪个?虽然这是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可以解决这个问题,尽管它可能会导致更多的开销,因为它是对象。

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


答案 1

这与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};
} 

通过这种简化,您可以注意到需要比 更多的内存资源。enumint

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

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

public void setImportantThing(int priviledge, int rights)

public void setImportantThing(Privilege p, Right r)

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

我们这里的情况是在编译时验证和运行时内存使用之间进行权衡。您应该自己决定何时应该使用以及在哪里足够安全。enumstatic int

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

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


答案 2

枚举包括:

  • 更安全 - 更能适应变化。

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

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

    enum { A, B, C }比起具有连接的一组项目,更明显psfi A = 0; psfi B = 1; psfi C = 2;

因此,除非您在使用 方面具有可衡量的优势,否则无论是在内存占用量还是速度方面,您都应该始终使用 。public static final intenum

请参阅何时优化为时过早?


推荐