使用返回不同类型的SpelExpressionParser解析表达式的方法

时间:2017-11-01 08:59:39

标签: java spring parsing spring-el

我创建了一个计算表达式的方法,该表达式是字符串连接或算术运算。所以我想创建一个可以返回String或Integer的方法。有更优雅和正确的方法吗?

private static Object calculateExpression(Object object) {
        ExpressionParser expressionParser = new SpelExpressionParser();
        Expression expression = expressionParser.parseExpression((String) object);

        if (expression.getValue() instanceof Integer) {
            return expression.getValue();
        } else if (expression.getValue() instanceof String) {
            return expression.getValue();
        }
        throw new IllegalArgumentException("Can process only Strings or Integers");
    }

3 个答案:

答案 0 :(得分:1)

如果您知道要传递的表达式应该被评估为什么类型,则可以使用泛型。我也会在参数中要求字符串而不是对象。因为SpEL总是一个字符串。

private static <T> T calculateExperssion(String expr, Class<T> class) {
    ExpressionParser expressionParser = new SpelExpressionParser();
    Expression expression = expressionParser.parseExpression(expr);
    return class.cast(expression.getValue());
}

使用此选项时,第二个参数可以是String.classInteger.class

答案 1 :(得分:1)

不,除非你在打电话之前认识课程,否则你可以使用仿制药,正如Stav Saad所说。否则你只需返回它并在返回后使用instanceof。然后你的功能就会变成。

private static Object calculateExpression(String input) {
    ExpressionParser expressionParser = new SpelExpressionParser();
    Expression expression = expressionParser.parseExpression(input);
    if (expression.getValue() instanceof Integer || expression.getValue() instanceof String ) {
        return expression.getValue();
    }
    throw new IllegalArgumentException("Can process only Strings or Integers");
}

public static void useCalculate() {
    Object expression = calculateExpression("Test");
    if(expression instanceof String) {
        //Do stringy stuff
    } else if(expression instanceof Integer) {
        //To inty stuff
    }
}

答案 2 :(得分:1)

好吧,我会添加一件事。在您的情况下,如果是字符串或整数,则返回结果,如果条件未满,则返回null。在这种情况下,没有必要使用instaceof运算符。你可以简单地返回价值。 Instanceof您必须在调用函数的地方使用Expression e = calculateExpression(Object object); if(e.getValue().instanceof(Integer)) int variabl = e.getValue(); else if(e.getValue().instanceof(String)) String s = e.getValue(); 。这是一个例子:

if (!(expression.getValue() instanceof Integer) || !(expression.getValue() instanceof Integer)) 

throw someExceptions();

如果您只想评估字符串和整数,那么仅对无法处理的情况进行测试。

instanceof

\这里需要因为你需要知道在将它赋给变量之前你得到了什么样的值,所以 If Worksheets("XXX").Range("D13") > 0 Then MsgBox ("ATENTION!" & vbCrLf & "OLD = ") & Worksheets("XXX").Range("D13") & " PCS !" End If If Worksheets("XXX").Range("E13") > 0 Then MsgBox ("ATENTION!" & vbCrLf & "REQUEST = ") & Worksheets("XXX").Range("E13") & " PCS !" End If 运算符是针对这种情况做出的。 所以在你的情况下你不需要检查实例,因为我猜这个Expression是你的Integer和String的超类。