我正在看一些由公司其他部门维护的Java代码,偶然是一些以前的C和C++开发人员.无处不在的一件事是使用静态整数常量,例如
class Engine {
private static int ENGINE_IDLE = 0;
private static int ENGINE_COLLECTING = 1;
...
}
Run Code Online (Sandbox Code Playgroud)
除了缺乏"最终"限定符之外,我对这种代码感到有点困扰.我希望看到的是,从学校主要用Java培训,会更像
class Engine {
private enum State { Idle, Collecting };
...
}
Run Code Online (Sandbox Code Playgroud)
然而,这些论点让我失望.为什么,如果有的话,后者比前者更好?
Mic*_*rdt 24
为什么,如果有的话,后者比前者更好?
它更好,因为它为您提供类型安全性并且是自我记录的.对于整数常量,您必须查看API文档以找出哪些值有效,并且没有什么可以阻止您使用无效值(或者更糟糕的是,完全不相关的整数常量).使用Enums,方法签名会直接告诉您哪些值有效(IDE自动完成将起作用),并且无法使用无效值.
遗憾的是,"整数常量枚举"模式非常常见,即使在Java标准API中(并从那里广泛复制),因为Java在Java 5之前没有枚举.
来自官方文档的摘录,http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html:
这种模式有很多问题,例如:
- 不是类型安全 - 因为一个季节只是一个int,你可以传递任何其他需要一个季节的int值,或者将两个季节加在一起(这没有任何意义).
- 无命名空间 - 您必须使用字符串(在本例中为SEASON_)为int枚举的常量添加前缀,以避免与其他int枚举类型发生冲突.
- 脆弱性 - 因为int枚举是编译时常量,所以它们被编译到使用它们的客户端中.如果在两个现有常量之间添加新常量或更改顺序,则必须重新编译客户端.如果他们不是,他们仍然会运行,但他们的行为将是不确定的.
- 打印的值没有信息 - 因为它们只是整数,如果你打印一个,你得到的只是一个数字,它不会告诉你它代表什么,甚至它不是什么类型.
而这只是涵盖它.一个单词的论点是,枚举更具可读性和信息性.
还有一件事是枚举,就像课程一样.可以有字段和方法.这使您可以选择在枚举本身中包含有关每种类型状态的一些其他信息.
因为枚举提供类型安全.在第一种情况下,您可以传递任何整数,如果您使用枚举,则仅限于Idle和Collecting.
仅供参考:http://www.javapractices.com/topic/TopicAction.do ? Id =1.
通过使用a int来引用常量,您不会强迫某人实际使用该常量.因此,例如,您可能有一个采用引擎状态的方法,有人可能会高兴地调用它:
engine.updateState(1);
Run Code Online (Sandbox Code Playgroud)
使用enum 强制用户坚持使用解释性标签,因此它更清晰.
| 归档时间: |
|
| 查看次数: |
4972 次 |
| 最近记录: |