允许简单的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_IF,
                TokenTypes.LITERAL_WHILE,
                TokenTypes.LITERAL_SWITCH,
            };

            for(int conditional : conditionals) {
                DetailAST conditionalAST = aAST.findFirstToken(conditional);

                if (conditionalAST != null) {
                    log(aAST.getLineNo(), \"ifBracesConditional\", 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(); 文件资料     

要回复问题请先登录注册