正如所指出的here lambda提供了一种非常优雅的方式来指定单个枚举值的行为。
在Java 8之前,我通常将其实现为:
enum Operator {
TIMES {
public int operate(int n1, int n2) {
return n1 * n2;
}
},
PLUS {
public int operate(int n1, int n2) {
return n1 + n2;
}
};
public int operate(int n1, int n2) {
throw new AssertionError();
}
}
现在我倾向于使用:
enum Operator {
TIMES((n1, n2) -> n1 * n2),
PLUS((n1, n2) -> n1 + n2);
private final BinaryOperator<Integer> operation;
private Operator(BinaryOperator<Integer> operation) {
this.operation = operation;
}
public int operate(int n1, int n2) {
return operation.apply(n1, n2);
}
}
这显得更加优雅。
我无法想到现在覆盖特定枚举值的方法的原因。所以我的问题是,有没有充分的理由在enum
中使用方法覆盖,或者功能界面是否应该首选?
答案 0 :(得分:5)
如果你看一下this answer总结了在这个enum
场景中使用lambda表达式的优点,你可能会注意到这些优点在Java 8之前的版本中都消失了。它既不比旧的专用enum
变体更具可读性,也不会提高性能。此外,{8}之前不存在interface BinaryOperator
所以它是您需要添加到代码库中以遵循此方法的另一个类。
如果您计划很快切换到Java 8,在Java 8之前的代码中使用此委派方法的主要原因是为了简化迁移。
更新至您更新的问题:
如果您主要关注Java 8用例,我建议在所有enum
个案例具有不同的行为时始终使用委派方法,这种行为仍然遵循可以从使用lambda表达式中受益的类似模式,如在你的例子中实现运算符就是这种情况。
一个反例可能是enum
,其中大多数都有一个共同的行为,只会被一个或几个案例覆盖。 E.g:
enum Tokens {
FOO, BAR, BAZ, AND, A, LOT, MORE // etc …
/** Special Token End-Of-File */
EOF {
@Override
public boolean matches(String input, int pos) {
return input.length()==pos;
}
};
// all ordinary tokens have the same behavior
public boolean matches(String input, int pos) {
return input.length()-pos >= name().length()
&& input.regionMatches(pos, name(), 0, name().length());
}
}