1

JCodeModel を使用して Java ソース コードを生成しており、次のような「if-elseif」ブロックを取得したいと考えています。

 if (foo){

 } else if (bar) {

 }

私が理解している限り、コードは次のようになります ( mは JMethod です)。

JConditional cond = m.body()._if(JExpr.direct("foo"));
cond._elseif(JExpr.direct("bar"));

単純なように見えますが、結果は次のとおりです。

if (foo) {
    } else {
        if (bar) {
        }
    }

構文の違いがわかります。実際には「elseif」ではありません。意味的には同じですが、前に示したように生成する必要があります (教育ソフトウェアの一部です)。これを行う方法はありますか?

4

1 に答える 1

1

JConditional残念ながら、その実装のため、を使用してこれを行うことはできません。メソッドのソースを見てください_elseif

 public JConditional _elseif(JExpression boolExp) {
     return _else()._if(boolExp);
 }

ご覧のとおり、このメソッドは呼び出し_else()てから_if内部的に呼び出します。

実際_else()には、デフォルトで( )JBlockを含むものです。のこのプロパティには、このようなセッターが含まれていないため、手動でオフにすることはできません。の特別なコンストラクターを介してのみオフに切り替えることができます:braces{ ... }JBlockbracesJBlock

 public JBlock(boolean bracesRequired, boolean indentRequired) {
     this.bracesRequired = bracesRequired;
     this.indentRequired = indentRequired;
 }

_elseただし、自分のオブジェクトをオブジェクトのフィールドにJConditional外側に設定することはできません。

唯一の方法は、クラスの実装をコピーJConditionalして独自の実装を生成することです。これにより、このようなコード操作が可能になります。

UPD:もちろん、オブジェクトのフラグを手動でに切り替えるための回避策としていつでも使用できReflectionます。bracesRequired_elsefalse

于 2013-01-14T09:10:28.293 に答える