JCodeModel和elseif

时间:2013-01-14 08:32:00

标签: java code-generation sun-codemodel

我正在使用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”。在语义上它是相同的,我知道,但我需要它如前所示生成(它是教育软件的一部分)。有什么办法吗?

1 个答案:

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