【问题标题】:Represent simple conditional statements in Java在 Java 中表示简单的条件语句
【发布时间】:2014-07-12 11:31:26
【问题描述】:

我正在做一个项目,我需要在对象属性和 [booleans|integers|float...] 上表示条件语句,因为我需要存储这些条件的结果(无论它们是真还是假)这样我以后就不用再去检查了(条件很多,其实是优化)。

class Foo {
    public String getThing() {
        return this.thing;
    }
    private String thing;

    public int getBob() {
        return this.bob;
    }
    private int bob;
}

class Bar {
    public String getStuff() {
        return this.stuff
    }
    private String stuff;
}

Foo foo = new Foo();
Bar bar = new Bar();

这里我想存储foo.thing != bar.stuff 的条件和foo.bob < 3 的条件。我希望能够存储所有 4 个主要操作 <, >, ==, !=(比较的对象将实现 Java 的 Comparable 接口)。

我想我可以将条件语句存储在一个

Triplet<getAttr1(), Operator.[Equal|GreaterThan...], getAttr2()

(带有评估函数,其中Operator 是我会定义的类)

属性可以存储为函数,因为属性的值总是由它的 getter 给出。事情是我也想和其他类型比较,比如boolean, int, float...

如何表示这些条件语句?

【问题讨论】:

  • 这闻起来有点像XY problem。你为什么要这样做?
  • 还有,过早的优化。
  • @MikkelLøkke:这正是我对“做决定的人”所说的话。可悲的是,他没有在听。
  • @Duncan:是的,我知道。实际上我看不出他们要求我做什么的兴趣。
  • 通过分析器运行它。 Yourkit 真的很棒,它会告诉你性能瓶颈到底在哪里。我可以绝对肯定地告诉你,需要时间的不是布尔表达式的求值。那就是问题不是if(a>b)这行,而是它可能正在计算a或b(或两者),花时间优化它会更好(特别是如果它也用于代码中的其他地方),而不是尝试推出自己的方法缓存机制。如果您真的必须这样做,那么表达式答案就是前进的方向。

标签: java conditional-statements


【解决方案1】:

考虑使用表达式,例如

interface Expression<T> {
    public T evaluate();
}

class BinaryDoubleExpression implements Expression<Double> {
    DoubleExpression left, right;
    DoubleOperator operator;

    BinaryDoubleExpression(double left, double right, BinaryDoubleOperator operator) {
        this.left = left;
        this.right = right;
    }

    Double evaluate() {
        return operator.operate(left.evaluate(), right.evaluate());
    }
}

enum BinaryDoubleOperator {
    ...
    Double operate();
}

这是一种对文字、一元、二元和三元运算符进行建模并支持不同类型的方法。然后每个实现都知道如何评估自己,从而遍历表达式的解析树。

【讨论】:

  • 这确实很有希望,但看起来像是在重新发明轮子,难道没有任何实现可以让我们表示文字吗?
  • @toogy DoubleLiteralExpression 大约需要三行代码,但您必须针对不同类型重复它,因为 Number 类没有任何算术方法。
  • 是的,但我也在处理不同类型的对象。我想说对象A的属性foo值低于3或者对象A的属性foo值等于对象B的属性foo值
  • 如果您需要查看“属性:”using el in a standalone manner,这是另一个选项。表达式和成熟的模板语言之间有一个连续统一体。你正在寻找的是它的某个地方。你只需要弄清楚你的要求是什么。
  • 谢谢,看起来像我要找的... =)
猜你喜欢
  • 2016-01-11
  • 2012-06-10
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 2015-07-21
  • 2017-08-06
  • 1970-01-01
  • 2015-06-09
相关资源
最近更新 更多