Ana*_*liy 5 java findbugs checkstyle pmd
在我们的链接if/else /项目中,如果我们想要进行以下格式化:
if (flag1) {
// Do something 1
} else if (flag2) {
// Do something 2
} else if (flag3) {
// Do something 3
}
Run Code Online (Sandbox Code Playgroud)
并禁止以下一个:
if (flag1) {
// Do something 1
} else {
if (flag2) {
// Do something 2
} else {
if (flag3) {
// Do something 3
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面列出的静态代码分析工具中是否有一些预定义规则强制使用此代码样式?如果不是 - 我知道有能力在所有这些工具中编写自定义规则,您建议实施这样的规则(不熟悉在其中任何一个中编写自定义规则)?
可以使用 CheckStyle 来完成,但您必须编写自定义检查代码。
使用自定义检查可以让您完全忽略评论。getLineNo()可以通过调用DetailAST来确定令牌所在的行号。这是 AST 的样子,带有行号信息(红色圆圈):

自定义检查的代码可能会很短。您基本上是注册LITERAL_ELSE令牌并查看是否LITERAL_IF是他们唯一的孩子。还要记住处理SLISTs。在那种情况下,LITERAL_IF并且RCURLY应该是唯一的孩子。上图说明了这两种情况。
作为记录,我最初认为还可以配置用于该属性的正则表达式匹配(基于这篇文章)。else[ \t{]*[\r\n]+[ \t{]*if\bformat
这是所提到的正则表达式作为铁路图:

else事实证明这是不可行的,因为当和之间有注释时,它会产生漏报if。if更糟糕的是,当嵌套后跟不相关的代码(例如 )时,它还会产生误报。else { if() {...} <block of code>}感谢 @Anatoliy 指出了这一点!由于正则表达式无法可靠地掌握注释和与注释混合的匹配大括号,因此这些问题使 RegExp 方法过时。