什么时候可以使用枚举的名称()
When is it OK to use an Enum's name()
变量的名称可以更改,不应影响逻辑。但是 Enum returns 中的 name()
方法将常量名称作为值,因此它可以破坏现有代码。我应该避免使用 name()
吗?
例如,
public enum Example1 {FOO, BAR}
将 FOO
名称重构为 FOO2
将制动 Example1.FOO.name().equals("FOO")
。
public enum Example2 {
FOO("FOO"),
BAR("BAR");
String code;
private Example2(final String code) {
this.code = code;
}
public String getCode() {
return code;
}
}
在这种情况下,将FOO
名称更改为FOO2
不会刹车Example2.FOO.getCode().equals("FOO")
。
当使用枚举类型时,我总是比较枚举本身而不是枚举的名称(字符串)。
Example2.FOO.equals(Example2.getEnumByName("FOO"));
- 业务逻辑应该使用枚举值,而不是直接使用
name()
。原因:即使名称改变,语义(与以前相同的枚举值)保持不变。
- 当serializing/deserializing值时使用
name()
。这会影响数据库(当使用 O/R 映射的名称时)、存储在文件中或通过网络传输的序列化数据(JSON/XML/YAML/...序列化)、日志条目等。
更改名称可能需要在第 3 方代码中进行数据迁移或改编。
您怀疑因为它泄漏了实现细节而普遍使用它是不明智的,这是正确的。如果您的颜色 enum
具有 RED
值,则使用 colour.name()
向程序用户报告某物的颜色是错误的,因为用户可能需要某种语言的消息英文以外的文字,全部大写的文字通常是不合适的。
在程序员使用的代码中使用它来帮助调试问题是可以的。比如异常信息,因为they should not be presented to normal program users.
变量的名称可以更改,不应影响逻辑。但是 Enum returns 中的 name()
方法将常量名称作为值,因此它可以破坏现有代码。我应该避免使用 name()
吗?
例如,
public enum Example1 {FOO, BAR}
将 FOO
名称重构为 FOO2
将制动 Example1.FOO.name().equals("FOO")
。
public enum Example2 {
FOO("FOO"),
BAR("BAR");
String code;
private Example2(final String code) {
this.code = code;
}
public String getCode() {
return code;
}
}
在这种情况下,将FOO
名称更改为FOO2
不会刹车Example2.FOO.getCode().equals("FOO")
。
当使用枚举类型时,我总是比较枚举本身而不是枚举的名称(字符串)。
Example2.FOO.equals(Example2.getEnumByName("FOO"));
- 业务逻辑应该使用枚举值,而不是直接使用
name()
。原因:即使名称改变,语义(与以前相同的枚举值)保持不变。 - 当serializing/deserializing值时使用
name()
。这会影响数据库(当使用 O/R 映射的名称时)、存储在文件中或通过网络传输的序列化数据(JSON/XML/YAML/...序列化)、日志条目等。
更改名称可能需要在第 3 方代码中进行数据迁移或改编。
您怀疑因为它泄漏了实现细节而普遍使用它是不明智的,这是正确的。如果您的颜色 enum
具有 RED
值,则使用 colour.name()
向程序用户报告某物的颜色是错误的,因为用户可能需要某种语言的消息英文以外的文字,全部大写的文字通常是不合适的。
在程序员使用的代码中使用它来帮助调试问题是可以的。比如异常信息,因为they should not be presented to normal program users.