让我们考虑一个枚举。
为每个对象创建一个带有“switch(this)”的方法有什么区别 并创建一个抽象方法并为枚举中的每个对象重写它?
答案 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方法用于与枚举的“核心”功能相关的问题,并在其他地方使用开关。