我有这个例子(在Java中),其中有模型,每个模型都有相同的类型集。我将类型定义为枚举。当我把这个程序提交给顾问(它是一个项目)时,他表示使用枚举是不明智的,因为它使程序对变更不灵活,因为枚举不可扩展。因此,如果我想在某个时刻添加另一种类型,我不能在不重新编译的情况下执行此操作。是否存在您更喜欢枚举而不是创建对象的情况?在我看来,如果你可以选择一个带有对象的灵活类和一个带有枚举的非灵活类,你也可以每次都使用对象,即使你是99%'确保类型永远不会改变。
答案 0 :(得分:2)
使用枚举可以改进静态/编译时间分析。您只能使用您指定的枚举。
这是否好是取决于该库是供内部消费还是外部消费。
对于内部消费,重新编译不是问题。您可以访问源,您可以随时添加其他值。 enum
的部分值是编译器时间检查它给你如此重新编译在这种情况下是一件好事。
对于外部消费,你必须要小心谨慎。您必须更加自信没有支持的理由来添加其他值。 (可能有理由扩展这些值,但如果不支持这些值,他们无论如何也无法做到)。您图书馆的用户不希望/可能赢得而无法重新编译您的图书馆添加一些功能。
我所做的就是尽力争取两全其美。
这允许您使用枚举,但是您允许库的用户定义他们自己的实现,这些实现可以是他们自己的枚举,也可以是动态创建的实例。
这是一个可以扩展的接口的枚举示例,但AFAIK,没有人有。 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;
}
};
等
答案 1 :(得分:0)
每次对象存在有限数量的可能状态时,都会使用枚举。每一次,无论你的主管在说什么。是的,看看这个:
答案 2 :(得分:0)