如何解决允许简单的if语句在代码样式中没有花括号
| 我使用checkstyle来检查我的Java代码是否遵守我们项目的准则。 但是,我们有一个准则,我无法弄清楚如何使用此工具进行检查。我们希望允许简单的if(理解if是否不包含其他条件结构)没有括号,例如本例所示:// valid
if(condition) callFunction();
// invalid
if(condition) for(int i = 0; i < someValue; i++) callFunction(i);
// valid
if(condition) {
for(int i = 0; i < someValue; i++) {
callFunction(i);
}
}
// invalid
if(condition) callFunction();
else callOtherFunction();
可以讨论这一约定,但这是我们选择的约定。对于非常琐碎的情况,它可以减少if语法,但是对于更复杂的结构,可以确保我们具有良好的缩进和块定界。
任何帮助将不胜感激。
如果没有可用的内容,我也准备做一些代码来执行此检查,但实际上不知道从哪里开始。在最后的解决方法中,有关此的一些技巧也将不胜感激。
解决方法
最后,我确实为checkstyle实现了自定义检查。如果有人对此感兴趣,这是源代码:
import com.puppycrawl.tools.checkstyle.api.Check;
import com.puppycrawl.tools.checkstyle.api.DetailAST;
import com.puppycrawl.tools.checkstyle.api.TokenTypes;
public class IfBracesCheck extends Check {
@Override
public int[] getDefaultTokens() {
return new int[] {
TokenTypes.LITERAL_ELSE,TokenTypes.LITERAL_IF,};
}
@Override
public void visitToken(DetailAST aAST) {
final DetailAST slistAST = aAST.findFirstToken(TokenTypes.SLIST);
if(aAST.getType() == TokenTypes.LITERAL_ELSE) {
// If we have an else,it must have braces,except it is an \"else if\" (then the if must have braces).
DetailAST ifToken = aAST.findFirstToken(TokenTypes.LITERAL_IF);
if(ifToken == null) {
// This is an simple else,it must have brace.
if(slistAST == null) {
log(aAST.getLineNo(),\"ifBracesElse\",aAST.getText());
}
} else {
// This is an \"else if\",the if must have braces.
if(ifToken.findFirstToken(TokenTypes.SLIST) == null) {
log(aAST.getLineNo(),\"ifBracesConditional\",ifToken.getText(),aAST.getText() + \" \" + ifToken.getText());
}
}
} else if(aAST.getType() == TokenTypes.LITERAL_IF) {
// If the if uses braces,nothing as to be checked.
if (slistAST != null) {
return;
}
// We have an if,we need to check if it has no conditionnal structure as direct child.
final int[] conditionals = {
TokenTypes.LITERAL_DO,TokenTypes.LITERAL_ELSE,TokenTypes.LITERAL_FOR,TokenTypes.LITERAL_WHILE,TokenTypes.LITERAL_SWITCH,};
for(int conditional : conditionals) {
DetailAST conditionalAST = aAST.findFirstToken(conditional);
if (conditionalAST != null) {
log(aAST.getLineNo(),aAST.getText(),conditionalAST.getText());
// Let\'s trigger this only once.
return;
}
}
}
}
}
,只是想补充一点,现在checkstyle支持\'allowSingleLineIf \'属性,该属性涵盖了某些情况。
<module name=\"NeedBraces\">
<property name=\"allowSingleLineIf\" value=\"true\"/>
</module>
,尽管我同意这是一个坏主意的评论,但您可能无法更改准则。因此,您可能需要尝试以下操作:
在checkstyle模块“块->需要大括号”中,禁用if关键字
创建模块Regexp-> RegexpSingleLineJava的新实例,并尝试查找与无效情况匹配但与有效情况不匹配的正则表达式
(模块名称来自Eclipse Checkstyle插件5.3.0)
,CheckStyle 6.14 NeedBraces检查角色支持allowSingleLineStatement选项
allowSingleLineStatement允许无括号的单行语句,例如:
如果(obj.isValid())返回true;
而(obj.isValid())返回true;
执行this.notify(); while(o!= null);
对于(int i = 0;;)this.notify();
文件资料
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。