2012-11-09 71 views
0

我有一个用例,其中一个对象存在一个字符串,其中有一个条件用于评估另一个对象的属性。 例如 StudentEvaluator具有条件JAVA动态属性条件评估

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

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

E.g. pastScore, currentScore and sportsParticipation 

现在,StudentEvaluator条件字符串在运行时创建,并且必须评估为true或false。 有许多StudentEvaluators与不同条件并行运行。 现在StudentEvaluator在其评估函数中接受学生参数并评估条件。 即

public Class StudentEvaluator{ 

String condition; 

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

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

} 

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

回答

2

在过去这样做。你有多种选择

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

谢谢,但事情是这只是一个用例,其中大约10000个StudentEvaluators将具有各自的条件的POC。那么这是可以扩展到那个水平吗?这可以通过更好的方法来完成吗?所以要求一种方法来处理这个:) –

+0

所有的三个规模都远远超过了100,000(这大概是我的批量)记录。确保您预先解析表达式并缓存它们。 –

+0

@ AravindR.Yarram:以上链接均不起作用。 –

0

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

+0

好的。你能评论它的效率吗? –

+0

@Pangea为您提供了更多的替代解决方案,您的意思是高效?解析表达式是一项常见任务,可以非常有效地完成,这不应该成为一个问题。 – remigio

+0

好的。谢谢。但事情是这仅仅是一个POC的用例,其中大约10000个StudentEvaluators会有各自的条件。所以需要一个方法来处理这个:) –

1

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

示例代码:

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

谢谢,但事情是这只是一个用例,其中大约10000个StudentEvaluators将具有各自的条件。那么这是可以扩展到那个水平吗?这可以通过更好的方法来完成吗?所以是要求一个方法来处理这个:) –