代码之家  ›  专栏  ›  技术社区  ›  Matt Ball

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

  •  0
  • Matt Ball  · 技术社区  · 16 年前

    我正在寻找一种优雅的方式来使用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 回复  |  直到 16 年前
        1
  •  3
  •   Pops Atula    16 年前

    这不仅是可能的,而且在经常被引用的 Effective Java, Second Edition by Josh Bloch . 我不想插手他的版权,会在网上找一个类似的例子…

    好的,我记得的代码在我之前链接的网站上是免费的。单击“下载本书中使用的代码示例”,然后查看 effective2/examples/Chapter6/Item30/Operation.java .

        2
  •  0
  •   Andrey    16 年前
    int a = ..., b = ...;
    Operator foo = ...;
    return foo.apply(a, b);
    

    如果foo是对象,operator是基类,而concrete operator是实现apply的具体类,则可以这样做。