何时使用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