我正在寻找一种优雅的方法来使用Java枚举中的值来表示操作或函数。我的猜测是,因为这是Java,所以不会有一个很好的方法来实现它,但无论如何都要进行。我的枚举看起来像这样:
public enum Operator {
LT,
LTEQ,
EQEQ,
GT,
GTEQ,
NEQ;
...
}
其中LT
表示<
(小于),LTEQ
表示<=
(小于或等于)等等 - 您明白了。现在我想实际使用这些枚举值来应用运算符。我知道我可以使用一大堆if语句来做到这一点,但那是丑陋的OO方式,例如:
int a = ..., b = ...;
Operator foo = ...; // one of the enum values
if (foo == Operator.LT) {
return a < b;
}
else if (foo == Operator.LTEQ) {
return a <= b;
}
else if ... // etc
我希望能够做的是删除这个结构并使用某种一流的功能甚至多态,但我不确定如何。类似的东西:
int a = ..., b = ...;
Operator foo = ...;
return foo.apply(a, b);
甚至
int a = ..., b = ...;
Operator foo = ...;
return a foo.convertToOperator() b;
但就我所见,我认为不可能返回运营商或功能(至少,不是没有使用某些第三方库)。有什么建议吗?
答案 0 :(得分:3)
这不仅可以,而且在经常引用的Effective Java, Second Edition by Josh Bloch中用作示例。 我不想踩他的版权,会在网上寻找类似的例子......
好的,我记得的代码可以在我之前链接的网站上免费获得。点击“下载本书中使用的代码示例”,然后查看effective2/examples/Chapter6/Item30/Operation.java
。
答案 1 :(得分:0)
int a = ..., b = ...;
Operator foo = ...;
return foo.apply(a, b);
如果foo是object而Operator是基类,那么可以这样做,具体的运算符是实现apply的具体类。