我正在使用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”。在语义上它是相同的,我知道,但我需要它如前所示生成(它是教育软件的一部分)。有什么办法吗?
答案 0 :(得分: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
对象的_else
标记切换为false
。