Jas*_*key 16 java enums android constants
我有一个问题,我们何时应该使用Enum,何时应该使用最终常量?
我知道它已在Enums和Constants中讨论过.哪个用的?虽然这是C#问题.
我的问题是为什么Android使用这么多常量而不是Enum?例如, Context
在我看来,如果我们使用常量,可能存在以下风险:如果我们定义LEVEL常量
public static final int LEVEL_LOW=1;
public static final int LEVEL_MEDIUM=2;
public static final int LEVEL_HIGH=3;
Run Code Online (Sandbox Code Playgroud)
当我们传递一个int = 4的参数时.它不会有编译错误,如果我们传递1的数字,代码阅读器可能不容易知道它的意思.
但Enum可以解决这个问题,虽然它可能会导致更多的开销,因为它是Object.
那么为什么Android使用常量而不是Enum?在这种情况下,我们何时应该使用常数或枚举?
Dam*_*ash 16
这与android历史有关.在Froyo之前的版本中存在未经证实的性能问题.建议开发人员不要使用enum.自Froyo开始,设计性能文档按照此处的描述进行了重写.
您可能已经注意到,我们重写了Froyo的Designing for Performance文档.以前它是一堆在某些时候可能是真实的东西,但很久以来就不再与现实建立任何关系.在Froyo中,文档中的每个声明都有一个基准来支持,以证明(或者,在将来,反驳)它.您可以在浏览器中仔细阅读"Designing For Performance"基准测试.
但是改变遗留内容的结构毫无意义.
性能可能与需要存储String有关.每个常量与多个枚举的单个类的创建之间存在显着差异.
例如,在Java 7中,当你有一个包含两个字段的枚举时,你需要在poll常量中有44个项目,对于一个有两个静态最终整数的类,你只需要17个.
有什么不同
class ContantField {
public static final int f1 = 0;
public static final int f2 = 1;
}
enum ContantEnum {
E1,E2
}
Run Code Online (Sandbox Code Playgroud)
这两个声明在存储和使用方式上有很大不同.简化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};
}
Run Code Online (Sandbox Code Playgroud)
通过这种简化,您可以注意到enum
需要更多的内存资源int
.
要回答你的问题,必须理解枚举的作用.枚举的一个作用是增加编译时类型的安全性.
要指出这一点,请看这个例子:
public void setImportantThing(int priviledge, int rights)
public void setImportantThing(Privilege p, Right r)
Run Code Online (Sandbox Code Playgroud)
在int
我们可以传递任何int的值的情况下.在他的情况下,enum
我们被迫使用正确的一个.
我们这里的情况是在编译时验证和运行时的内存使用之间进行权衡.您应该自己决定何时使用enum
以及哪里static int
足够安全.
注:枚举被引入到Java 1.5版本,在使用前,这是比较困难的多.
在Android Studio Beta中,开发人员将能够使用注释强制实施类型安全.
枚举是:
更安全 - 更有弹性.
如果更改错误,更改枚举列表更有可能导致编译时错误.
更清晰 - 大多数开发人员会立即明白项目是以某种方式连接的.
enum { A, B, C }
更加明显的一个组项目与连接比psfi A = 0; psfi B = 1; psfi C = 2;
因此,除非你有一个可衡量的优势使用public static final int
,无论是在内存占用或速度,你应该总是使用enum
.