如何在IntelliJ IDEA(Maven)中实现自定义CheckStyle检查注释结尾带句号?
自定义CheckStyle注释结尾句号检查实现思路
核心步骤
- 确定监听的Token类型:针对单行注释、多行注释、Javadoc注释,分别监听
TokenTypes.SINGLE_LINE_COMMENT、TokenTypes.BLOCK_COMMENT_BEGIN、TokenTypes.JAVADOC_COMMENT三类Token。 - 提取有效注释内容:根据注释类型剥离注释标记(如
//、/* */、/** */),再去除内容前后的空白字符。 - 检查结尾字符:判断处理后的注释内容最后一个非空白字符是否为英文句号(
.),若不是则触发违规提示。
代码实现示例
import com.puppycrawl.tools.checkstyle.api.AbstractCheck; import com.puppycrawl.tools.checkstyle.api.DetailAST; import com.puppycrawl.tools.checkstyle.api.TokenTypes; public class CommentEndsWithPeriodCheck extends AbstractCheck { @Override public int[] getDefaultTokens() { return new int[]{ TokenTypes.SINGLE_LINE_COMMENT, TokenTypes.BLOCK_COMMENT_BEGIN, TokenTypes.JAVADOC_COMMENT }; } @Override public int[] getAcceptableTokens() { return getDefaultTokens(); } @Override public int[] getRequiredTokens() { return getDefaultTokens(); } @Override public void visitToken(DetailAST ast) { String commentText = ast.getText(); String content = ""; // 按注释类型提取有效内容 switch (ast.getType()) { case TokenTypes.SINGLE_LINE_COMMENT: content = commentText.substring(2).trim(); break; case TokenTypes.BLOCK_COMMENT_BEGIN: content = commentText.substring(2, commentText.length() - 2).trim(); break; case TokenTypes.JAVADOC_COMMENT: content = commentText.substring(3, commentText.length() - 2).trim(); break; } // 跳过空注释 if (content.isEmpty()) { return; } // 检查结尾是否为句号 char lastChar = content.charAt(content.length() - 1); if (lastChar != '.') { log(ast.getLineNo(), "注释结尾必须带有句号"); } } }
补充配置说明
- 消息配置:可在项目
messages.properties中添加国际化提示文本,或直接在log方法中写死提示内容。 - Maven依赖:确保项目依赖与CheckStyle插件版本匹配的核心库,示例:
<dependency> <groupId>com.puppycrawl.tools</groupId> <artifactId>checkstyle</artifactId> <version>10.12.6</version> <scope>provided</scope> </dependency> - CheckStyle配置文件:在
checkstyle.xml的TreeWalker模块下添加自定义检查:<module name="CommentEndsWithPeriodCheck"> <!-- 自定义类非默认包时,需指定全类名 --> <!-- <property name="class" value="com.yourpackage.CommentEndsWithPeriodCheck"/> --> </module>
特殊场景处理
- 若要求多行注释每一行结尾都要有句号,可将提取的内容按换行符分割,逐行trim后检查每行结尾字符。
- 若需支持中文句号(。),修改判断条件为
lastChar != '.' && lastChar != '。'即可。
内容的提问来源于stack exchange,提问作者Jared Starman
相关产品推荐
相关产品推荐

