添加 JExpression (JOp.cond()) 到 JBlock (JMethod body)
Add JExpression (JOp.cond()) to JBlock (JMethod body)
我想将 if - else 语句重构为三元运算符。
if ((variable) == null) {
... do something
} else {
... do something else
}
使用 Codemodel 创建三元运算符非常简单,与 JOp.cond() 一样,我们可以将条件、ifTrue 和 ifFalse 参数传递给 return 三元语句。
我的问题是将 JExpression 添加到方法体 (JBlock) 中:
private void printSomeObject(final JMethod toStringMethod, FieldOutline fo) {
String property = fo.getPropertyInfo().getName(false);
JBlock block = toStringMethod.body();
JExpression cond = JExpr.direct(property).eq(JExpr._null());
JExpression ifTrue = JExpr.direct("... do something");
JExpression ifFalse = JExpr.direct("... do something else");
JExpression ternary = JOp.cond(cond, ifTrue, ifFalse);
// toStringMethod.body().add(generateBody(ternary)); ONLY WORKS WITH JSTATEMENT
...
}
有人知道如何将 JExpression 添加到 JBlock 吗?
一个三元运算符被用作声明returns一个值。它不是 if/else 块的直接替代品。
尝试编译以下内容,它会失败:
1 == 1 ? System.out.pritln("true") : System.out.println("false");
JCodeModel 在这里要求三元组是 JExpression 是正确的。要将它添加到 JBlock,您需要将它分配给一个变量:
JDefinedClass output = codeModel._class(JMod.PUBLIC, "org.Test", ClassType.CLASS);
JMethod method = output.method(JMod.PUBLIC, codeModel.VOID, "test");
method.body().decl(codeModel.ref(String.class), "value", JOp.cond(JExpr.lit(1).eq(JExpr.lit(1)), JExpr.lit("true"), JExpr.lit("false")));
生成:
public class Test {
public void test() {
String value = ((1 == 1)?"true":"false");
}
}
继承@John Ericksen 的评论,以下代码将允许您在方法调用中添加一个三元运算符,例如 StringBuilder.append()
JExpression expr = JOp.cond(JExpr.lit(1).eq(JExpr.lit(1)), JExpr.lit("true"), JExpr.lit("false"));
JConditional conditional = method.body()._if(JExpr.lit(x).ne(JExpr._null()));
conditional._then().add(out.invoke("append").arg(expr1));
生成
if (x != null) {
out.append(((1 == 1)?"true":"false"));
}
我想将 if - else 语句重构为三元运算符。
if ((variable) == null) {
... do something
} else {
... do something else
}
使用 Codemodel 创建三元运算符非常简单,与 JOp.cond() 一样,我们可以将条件、ifTrue 和 ifFalse 参数传递给 return 三元语句。
我的问题是将 JExpression 添加到方法体 (JBlock) 中:
private void printSomeObject(final JMethod toStringMethod, FieldOutline fo) {
String property = fo.getPropertyInfo().getName(false);
JBlock block = toStringMethod.body();
JExpression cond = JExpr.direct(property).eq(JExpr._null());
JExpression ifTrue = JExpr.direct("... do something");
JExpression ifFalse = JExpr.direct("... do something else");
JExpression ternary = JOp.cond(cond, ifTrue, ifFalse);
// toStringMethod.body().add(generateBody(ternary)); ONLY WORKS WITH JSTATEMENT
...
}
有人知道如何将 JExpression 添加到 JBlock 吗?
一个三元运算符被用作声明returns一个值。它不是 if/else 块的直接替代品。
尝试编译以下内容,它会失败:
1 == 1 ? System.out.pritln("true") : System.out.println("false");
JCodeModel 在这里要求三元组是 JExpression 是正确的。要将它添加到 JBlock,您需要将它分配给一个变量:
JDefinedClass output = codeModel._class(JMod.PUBLIC, "org.Test", ClassType.CLASS);
JMethod method = output.method(JMod.PUBLIC, codeModel.VOID, "test");
method.body().decl(codeModel.ref(String.class), "value", JOp.cond(JExpr.lit(1).eq(JExpr.lit(1)), JExpr.lit("true"), JExpr.lit("false")));
生成:
public class Test {
public void test() {
String value = ((1 == 1)?"true":"false");
}
}
继承@John Ericksen 的评论,以下代码将允许您在方法调用中添加一个三元运算符,例如 StringBuilder.append()
JExpression expr = JOp.cond(JExpr.lit(1).eq(JExpr.lit(1)), JExpr.lit("true"), JExpr.lit("false"));
JConditional conditional = method.body()._if(JExpr.lit(x).ne(JExpr._null()));
conditional._then().add(out.invoke("append").arg(expr1));
生成
if (x != null) {
out.append(((1 == 1)?"true":"false"));
}