我有这个例子(Java),其中有模型,每个模型都有相同的类型集。我将类型定义为枚举。当我向顾问展示这个程序(这是一个项目)时,他表示使用枚举是不明智的,因为它使程序对于更改不灵活,因为枚举不可扩展。因此,如果我想在某个时候添加另一种类型,我无法在不重新编译的情况下执行此操作。是否有过这样的情况:您更喜欢枚举而不是创建对象?在我看来,如果您可以在带有对象的灵活类和带有枚举的非灵活类之间进行选择,那么您最好每次都使用对象,即使您“99%”确定类型永远不会改变。
最佳答案
使用枚举可以改进静态/编译时分析。您只能使用您指定的枚举。
这是否好取决于该库是供内部还是外部使用。
对于内部消耗,重新编译不是问题。您可以访问源代码,并可以在需要时添加另一个值。 enum
的部分值(value)是它为您提供的编译器时间检查,因此在这种情况下重新编译是一件好事。
对于外部消费,你必须更加小心。您必须更加确信没有任何支持的理由来添加另一个值。 (可能有理由扩展这些值,但如果不支持这些值,他们无论如何都无法这样做)您的库的用户将不希望/可能无法仅仅为了添加一些功能而重新编译您的库.
我所做的就是尽力两全其美。
- 我定义并使用一个接口(interface)
- 我的实现是枚举
这允许您使用枚举,但您允许库的用户定义他们自己的实现,这些实现可以是他们自己的枚举,也可以是动态创建的实例。
<小时/>这是一个可以扩展的接口(interface)的枚举示例,但据我所知,没有人这样做。 StopCharTesters
public enum StopCharTesters implements StopCharTester {
COMMA_STOP {
@Override
public boolean isStopChar(int ch) {
return ch < ' ' || ch == ',';
}
}, CONTROL_STOP {
@Override
public boolean isStopChar(int ch) {
return ch < ' ';
}
},
SPACE_STOP {
@Override
public boolean isStopChar(int ch) {
return Character.isWhitespace(ch) || ch == 0;
}
},
XML_TEXT {
@Override
public boolean isStopChar(int ch) {
return ch == '"' || ch == '<' || ch == '>' || ch == 0;
}
},
FIX_TEXT {
@Override
public boolean isStopChar(int ch) {
return ch <= 1;
}
};
等等
关于java - 什么时候使用枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22742436/