gpt4 book ai didi

java - JCodeModel 和 elseif

转载 作者:太空宇宙 更新时间:2023-11-04 07:51:55 27 4
gpt4 key购买 nike

我正在使用 JCodeModel 生成 Java 源代码,并希望获得如下所示的“if-elseif” block :

 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”。我知道,从语义上讲,它是相同的,但我需要如之前所示生成它(它是教育软件的一部分)。有办法做到这一点吗?

最佳答案

遗憾的是,由于其实现原因,您无法使用 JConditional 来执行此操作。看一下方法_elseif的源码:

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

如您所见,此方法仅在内部调用 _else(),然后调用 _if

实际上_else()JBlock,默认包含大括号 ({ ... })。 JBlock 的此属性无法手动关闭,因为它不包含此类 setter 。 大括号只能通过JBlock的特殊构造函数关闭:

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

但您无法将自己的对象向外设置为 JConditional 对象的 _else 字段。

唯一的方法是复制 JConditional 类实现并生成您自己的类实现,这将允许您进行此类代码操作。

UPD:当然,您始终可以使用 Reflection 作为解决方法,将 _else 对象的标记 bracesRequired 手动切换为 false

关于java - JCodeModel 和 elseif,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14315139/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com