我有这个例子(在Java中),其中有模型,每个模型都具有相同的类型集。我将类型定义为枚举。当我把这个程序展示给指导老师(这是一个项目)时,他说使用枚举是不明智的,因为它使程序不灵活,无法进行更改,因为枚举不可扩展。因此,如果我想在某个时候添加另一种类型,我必须重新编译才能做到这一点。有没有一种情况,你更喜欢枚举而不是创建对象?在我看来,如果你可以在具有对象的灵活类和具有枚举的非灵活类之间进行选择,你也可以每次都使用对象,即使你'99%'确定类型永远不会改变。
使用枚举可以改进静态/编译时分析。只能使用指定的枚举。
这是好是坏取决于库是供内部使用还是供外部使用。
对于内部消费,重新编译不是问题。您可以访问源,可以在需要时添加另一个值。enum
值的一部分是编译器检查它给你的时间,所以在这种情况下重新编译是一件好事。
对于外部消费,您必须更加小心。你必须更加确信,没有任何理由支持你增加另一个价值。(可能有理由扩展这些值,但如果这些值不受支持,他们无论如何也不能这样做)您的库的用户将不希望/可能无法仅仅为了添加一些功能而重新编译您的库。
我所做的就是尽量做到两全其美。
- 我定义并使用一个接口
- 我有一些实现是枚举
这允许你使用枚举,但是你允许库的用户定义他们自己的实现,可以是他们自己的枚举,或者是动态创建的实例。
这是一个接口的枚举示例,它可以扩展,但我敢肯定,没有人扩展过。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;
}
};
等。
当一个对象的可能状态数量有限时,就应该使用枚举。每次都这样,不管你的上司怎么说。是的,看看这个:
枚举:为什么?什么时候?
- 当枚举的成员永远不能更改时,您更喜欢枚举。例如,如果你正在开发国际象棋程序,你可以绝对确定棋子列表永远不会改变。
- 在修改enum成员时需要对代码进行其他修改。例如,如果枚举表示加密算法,则不能直接添加新算法。你必须执行它。这意味着无论如何你的程序都必须重新编译。请注意,此规则不是绝对的:您可以创建动态发现特定接口可用实现的程序。