【问题标题】:Using enum values to represent binary operators or functions使用枚举值来表示二元运算符或函数
【发布时间】:2010-03-11 19:22:39
【问题描述】:

我正在寻找一种优雅的方式来使用 Java 枚举中的值来表示操作或函数。我的猜测是,因为这是 Java,所以不会有一个很好的方法来做到这一点,但无论如何都是这样。我的枚举看起来像这样:

public enum Operator {
    LT,
    LTEQ,
    EQEQ,
    GT,
    GTEQ,
    NEQ;

    ...
}

其中LT 表示<(小于),LTEQ 表示<=(小于或等于)等等 - 你明白了。现在我想实际使用这些枚举值来应用运算符。我知道我可以只使用一大堆 if 语句来做到这一点,但那是丑陋的面向对象的方式,例如:

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;

但据我所见,我认为不可能返回运算符或函数(至少,在不使用某些 3rd-party 库的情况下是不可能的)。有什么建议吗?

【问题讨论】:

  • 您希望通过这个实现什么目标? Java 中的操作符不太可能发生变化,如果这是您试图抽象出来的内容。
  • 不,这不是我想要做的。

标签: java enums


【解决方案1】:

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

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

【讨论】:

  • 代码太奇怪了。如果没有 cmets,我的 java 太低了,无法理解。
  • 是否有特定的部分让您感到困惑?那里很多概念,所以解释整个事情有点超出了SO帖子的范围。
【解决方案2】:
int a = ..., b = ...;
Operator foo = ...;
return foo.apply(a, b);

如果 foo 是对象并且 Operator 是基类并且具体运算符是实现 apply 的具体类,则可以这样做。

【讨论】:

  • 你有一个抽象类“Operator”,它有单一的方法应用。有像 LessOrEqualTo 这样的子类实现 apply(a, b) { return a
猜你喜欢
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多