【问题标题】:Java Enum methods - switch vs Overriding for each objectJava Enum 方法 - 为每个对象切换与覆盖
【发布时间】:2017-03-01 05:02:29
【问题描述】:
让我们考虑一个枚举。
用“switch(this)”为每个对象创建一个方法有什么区别
并为枚举中的每个对象创建一个抽象方法并覆盖它?
【问题讨论】:
标签:
java
enums
switch-statement
overriding
abstract
【解决方案1】:
使用开关,您可以共享代码,同一代码的许多案例标签组合。
如果每个枚举都不同(或大部分不同),我会使用覆盖。
注意:您可以使用默认实现并覆盖不同的实现。
【解决方案2】:
如果您不更改枚举,则不一定有区别。但是,让我们看一个例子:
enum MyEnum {
FIRST
{
@Override
void foo() {
//Do something
}
},
SECOND
{
@Override
void foo() {
//Do something else
}
};
abstract void foo();
}
现在,如果我们要向这个枚举添加一个新元素 THIRD,那么编译器会确保我们实际实现了这个方法。
让我们来看看开关盒:
enum MyEnum {
FIRST,
SECOND;
void foo() {
switch (this) {
case FIRST:
//Do something
break;
case SECOND:
//Do something else
break;
default:
break;
}
}
}
如果我们要添加一个新元素 THIRD,那么我们可能会忘记在 switch 语句中添加一个额外的 case,这意味着我们需要更加小心。
另外一个区别就是 switch 可以用于这些枚举对象的外部功能,而我们不能向枚举本身添加其他方法。
【解决方案3】:
enum 方法的优点是遵循 Open/Closed 原则。如果需要扩展枚举,只需为新的枚举成员实现方法即可;否则你必须通过你的代码找到你的枚举用于涵盖所有可能性。
缺点是,如果你对它过于严格,你可能会在你的代码中放太多东西。想象一下,您有一个涵盖业务级别的年龄范围的枚举,并且您希望在 UI 级别根据用户的年龄呈现不同的布局......显然,向枚举添加一个指定 HTML 详细信息的方法会破坏许多抽象级别。
对于与枚举的“核心”功能相关的问题,我倾向于使用枚举方法,并在其他地方使用开关。