2016-08-10 20 views
0

if-elseステートメントを三項演算子にリファクタリングします。 Codemodelと三項演算子を作成するJBlock(JMethod本体)にJExpression(JOp.cond())を追加します。

if ((variable) == null) { ... do something } else { ... do something else }

JOp.cond(のように、非常に簡単です)、私たちは三元の文を返すために、条件にifTrueとifFalseパラメータを渡すことができます。

私の問題は、メソッド本体(JBlock)にJExpressionを追加することである:

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 
    ... 
} 

は誰JBlockにJExpressionを追加する方法についてのアイデアを持って?

答えて

1

三項演算子は、値を返す文として使用されます。これは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"); 
    } 

} 
+0

たとえば、StringBuilderを使用してtoString出力を生成し、戻り値を変数として格納する必要がない次の文が必要だった場合は可能ですか? 'stringbuilder.append(1 == 1" true ":" false ")' – coderwurst

+0

JOpを式に格納し、それを最初のif式の_thenブロックに追加することで、可能です - 今後これをしたいと思っている人のために、これを以下の返信として追加します – coderwurst

0

、次のコードは、三項演算子を追加することができますメソッド呼び出し内、例えば、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)); 

を生成
関連する問題