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( ) 的。{ ... }这个属性JBlock不能手动关闭,因为它不包含这样的设置器braces只能通过以下特殊构造函数关闭JBlock

 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 回答