Java Enum方法 - 为每个对象切换vs Overriding

时间:2016-10-19 13:51:37

标签: java enums switch-statement override abstract

让我们考虑一个枚举。

为每个对象创建一个带有“switch(this)”的方法有什么区别 并创建一个抽象方法并为枚举中的每个对象重写它?

3 个答案:

答案 0 :(得分:2)

当您不更改枚举时,没有必要存在差异。但是,让我们看一个例子:

THIRD

现在,如果我们要向此枚举添加一个新元素enum MyEnum { FIRST, SECOND; void foo() { switch (this) { case FIRST: //Do something break; case SECOND: //Do something else break; default: break; } } } ,那么编译器将确保我们实际实现此方法。

让我们看看开关盒:

THIRD

如果我们要添加一个新元素switch,那么我们就可以忘记在switch语句中添加一个额外的case,这意味着我们需要更加小心。

另外一个区别就是{{1}}可以用于这些枚举对象的外部功能,而我们无法在枚举本身中添加其他方法。

答案 1 :(得分:1)

使用开关可以共享代码,同一代码的案例标签的多种组合。

如果每个枚举都不同(或者大部分都是),我会使用覆盖。

注意:您可以使用默认实现并覆盖不同的实现。

答案 2 :(得分:0)

enum方法具有遵循开放/封闭原则的优点。如果你需要扩展枚举,你所要做的就是为新的枚举成员实现方法,你很好;否则你必须通过你的代码查找你的枚举用于涵盖所有可能性。

缺点是,如果你对它过于严格,你可能会在代码中添加太多东西。想象一下,你有一个包含业务级别年龄范围的枚举,并且你希望在UI级别根据用户的年龄呈现不同的布局......显然,在enum中添加一个指定HTML细节的方法会破坏许多抽象层次。

我倾向于将enum方法用于与枚举的“核心​​”功能相关的问题,并在其他地方使用开关。