为了账号安全,请及时绑定邮箱和手机立即绑定

如何禁用特定代码行的特定checkstyle规则?

/ 猿问

如何禁用特定代码行的特定checkstyle规则?

手掌心 2019-10-15 14:09:38

我在项目中配置了一个checkstyle验证规则,该规则禁止使用超过3个输入参数来定义类方法。该规则适用于我的类,但是有时我必须扩展第三方类,这些第三方类不遵守此特定规则。


是否有可能指示“ checkstyle”应静默忽略某些方法?


顺便说一句,我最终得到了自己的checkstyle包装器:qulice.com(请参阅Java代码质量的严格控制)


查看完整描述

3 回答

?
萧十郎

在http://checkstyle.sourceforge.net/config_filters.html#SuppressionCommentFilter上检查supressionCommentFilter的使用。您需要将模块添加到您的checkstyle.xml中


<module name="SuppressionCommentFilter"/>

并且它是可配置的。因此,您可以在代码中添加注释以关闭checkstyle(在各个级别上),然后通过在代码中使用注释再次将其重新打开。例如


//CHECKSTYLE:OFF

public void someMethod(String arg1, String arg2, String arg3, String arg4) {

//CHECKSTYLE:ON

甚至更好,请使用以下经过调整的版本:


<module name="SuppressionCommentFilter">

    <property name="offCommentFormat" value="CHECKSTYLE.OFF\: ([\w\|]+)"/>

    <property name="onCommentFormat" value="CHECKSTYLE.ON\: ([\w\|]+)"/>

    <property name="checkFormat" value="$1"/>

</module>

它允许您关闭对特定代码行的特定检查:


//CHECKSTYLE.OFF: IllegalCatch - Much more readable than catching 7 exceptions

catch (Exception e)

//CHECKSTYLE.ON: IllegalCatch

*注意:您还必须添加FileContentsHolder:


<module name="FileContentsHolder"/>

也可以看看


<module name="SuppressionFilter">

    <property name="file" value="docs/suppressions.xml"/>

</module>

在SuppressionFilter同一页面上的部分下,您可以关闭对模式匹配资源的单独检查。


因此,如果您在checkstyle.xml中:


<module name="ParameterNumber">

   <property name="id" value="maxParameterNumber"/>

   <property name="max" value="3"/>

   <property name="tokens" value="METHOD_DEF"/>

</module>

您可以使用以下命令在抑制XML文件中将其关闭:


<suppress id="maxParameterNumber" files="YourCode.java"/>

现在,Checkstyle 5.7中可用的另一种方法是通过@SuppressWarningsjava注释抑制违规。为此,您需要在配置文件中添加两个新模块(SuppressWarningsFilter和SuppressWarningsHolder):


<module name="Checker">

   ...

   <module name="SuppressWarningsFilter" />

   <module name="TreeWalker">

       ...

       <module name="SuppressWarningsHolder" />

   </module>

</module> 

然后,在您的代码中,您可以执行以下操作:


@SuppressWarnings("checkstyle:methodlength")

public void someLongMethod() throws Exception {

或者,对于多重抑制:


@SuppressWarnings({"checkstyle:executablestatementcount", "checkstyle:methodlength"})

public void someLongMethod() throws Exception {

注意: “ checkstyle:”前缀是可选的(但建议使用)。根据文档,参数名称必须全部小写,但实践表明任何大小写都可行。


查看完整回答
反对 回复 2019-10-15
?
一只斗牛犬

如果您更喜欢使用注释来选择性地使规则静音,则现在可以使用@SuppressWarnings注释,从Checkstyle 5.7(由Checkstyle Maven Plugin 2.12+支持)开始。


首先,在中checkstyle.xml,将SuppressWarningsHolder模块添加到TreeWalker:


<module name="TreeWalker">

    <!-- Make the @SuppressWarnings annotations available to Checkstyle -->

    <module name="SuppressWarningsHolder" />

</module>

接下来,启用SuppressWarningsFilter(作为的同级TreeWalker):


<!-- Filter out Checkstyle warnings that have been suppressed with the @SuppressWarnings annotation -->

<module name="SuppressWarningsFilter" />


<module name="TreeWalker">

...

现在,您可以注释例如要从某些Checkstyle规则中排除的方法:


@SuppressWarnings("checkstyle:methodlength")

@Override

public boolean equals(Object obj) {

    // very long auto-generated equals() method

}

checkstyle:参数to中的前缀@SuppressWarnings是可选的,但我想提醒您此警告的来源。规则名称必须为小写。


最后,如果您使用的是Eclipse,它将抱怨该参数未知:


不支持的@SuppressWarnings(“ checkstyle:methodlength”)


如果愿意,可以在首选项中禁用此Eclipse警告:


Preferences:

  Java

  --> Compiler

  --> Errors/Warnings

  --> Annotations

  --> Unhandled token in '@SuppressWarnings': set to 'Ignore'


查看完整回答
反对 回复 2019-10-15
?
www说

SuppressWithNearbyCommentFilter也很好用,它使用单个注释来抑制审核事件。


例如


// CHECKSTYLE IGNORE check FOR NEXT 1 LINES

public void onClick(View view) { ... }

要配置过滤器,以使CHECKSTYLE IGNORE check for NEXT var LINES避免触发针对当前行和下一个var行(总计var + 1行)的给定检查的任何审核:


<module name="SuppressWithNearbyCommentFilter">

    <property name="commentFormat" value="CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINES"/>

    <property name="checkFormat" value="$1"/>

    <property name="influenceFormat" value="$2"/>

</module>

http://checkstyle.sourceforge.net/config.html


查看完整回答
反对 回复 2019-10-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信