何时使用枚举?

时间:2014-03-30 09:37:35

标签: java enums

我有这个例子(在Java中),其中有模型,每个模型都有相同的类型集。我将类型定义为枚举。当我把这个程序提交给顾问(它是一个项目)时,他表示使用枚举是不明智的,因为它使程序对变更不灵活,因为枚举不可扩展。因此,如果我想在某个时刻添加另一种类型,我不能在不重新编译的情况下执行此操作。是否存在您更喜欢枚举而不是创建对象的情况?在我看来,如果你可以选择一个带有对象的灵活类和一个带有枚举的非灵活类,你也可以每次都使用对象,即使你是99%'确保类型永远不会改变。

3 个答案:

答案 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)

每次对象存在有限数量的可能状态时,都会使用枚举。每一次,无论你的主管在说什么。是的,看看这个:

Enumerations: Why? When?

答案 2 :(得分:0)

  1. 当您的成员永远无法更改时,您更喜欢枚举。例如,如果您正在开发国际象棋程序,您可以绝对确保棋子列表永远不会被更改。
  2. 更改枚举成员时需要对代码进行其他更改。例如,如果您的枚举提供加密算法,则不能只添加新算法。你必须实现它。这意味着您的程序无论如何都必须重新编译。请注意,此规则不是绝对的:您可以创建程序,以动态发现特定接口的可用实现。