使用枚举值表示二元运算符或函数

时间:2010-03-11 19:22:40

标签: java enums

我正在寻找一种优雅的方法来使用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;

但就我所见,我认为不可能返回运营商或功能(至少,不是没有使用某些第三方库)。有什么建议吗?

2 个答案:

答案 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的具体类。