【问题标题】:JAVA dynamic attributes condition evaluationJAVA动态属性条件评估
【发布时间】:2012-11-09 15:48:20
【问题描述】:

我有一个用例,其中一个对象存在一个字符串,该字符串具有针对另一个对象的属性进行评估的条件。 例如。 StudentEvaluator有条件

student.pastScore>70 && student.currentScore>90 && student.sportsParticipation=true

并且Student 对象具有各自的属性。

E.g. pastScore, currentScore and sportsParticipation

现在StudentEvaluator 条件字符串是在运行时创建的,并且必须评估真假。 有许多 StudentEvaluator 在不同的条件下并行运行。 现在 StudentEvaluator 在其评估函数中接受一个学生参数并评估条件。 即

public Class StudentEvaluator{

String condition;

  public StudentEvaluator(String condition){
    this.condition = condition;
  }

  evaluate(Student student){
    <<Code>>
  }

}

评估最有效的方法是什么? 欢迎任何开箱即用的想法! :)

【问题讨论】:

    标签: java oop conditional-statements evaluation


    【解决方案1】:

    过去做过。您有多种选择

    1. OGNL
    2. MVEL - 比 OGNL 性能更高。支持logical and conditional operators.
    3. SpEL - Spring Expression Language - 我的偏好。

    【讨论】:

    • 谢谢,但问题是这只是一个用例的 POC,其中大约 10000 名 StudentEvaluator 会有各自的条件。那么这可以扩展到那个级别吗?这可以通过更好的方法来实现吗?所以要求一种方法来处理这个问题:)
    • 所有这三个规模都远远超过 100,000 条(这大约是我的批量大小)记录。确保预先解析表达式并缓存它们。
    • @RameshPapaganti 修复了所有链接
    【解决方案2】:

    如果属性遵循 JavaBeans 标准(即它们是带有 getter 和 setter 的字段),那么您可以使用像 Apache Commons / BeanUtils 这样的技术。

    示例代码:

    Student student = // some student
    Map<String, Object> studentProperties = BeanUtils.describe(student);
    Integer currentScore = studentProperties.get("currentScore"); // etc.
    

    【讨论】:

    • 谢谢,但问题是这只是一个用例的 POC,其中大约 10000 名 StudentEvaluator 会有各自的条件。那么这可以扩展到那个级别吗?这可以通过更好的方法来实现吗?所以要求一种方法来处理这个问题:)
    【解决方案3】:

    这并不简单,其实你需要一个表达式解析器语言,也许你可以使用现有的解决方案,即jexel

    【讨论】:

    • 好的..你能评论一下它的效率吗?
    • @Pangea 为您提供了更多替代方案,您所说的高效是什么意思?解析表达式是一项常见任务,可以非常高效地完成,这应该不是问题。
    • 好的。谢谢。但问题是这只是一个用例的 POC,其中大约 10000 名 StudentEvaluator 会有各自的条件。所以要求一种方法来处理这个问题:)
    • 鉴于条件由 String 对象表示,我认为没有比使用表达式解析器更有效的解决方案。否则,您应该使用更复杂的数据结构来表示条件,该数据结构直接包含表达式的树结构,以使用每个节点处的逻辑子句进行评估。这样你就可以在没有解析阶段的情况下完成它,但是你需要支付更复杂的代码来开发。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2015-09-13
    相关资源
    最近更新 更多