如何禁用特定代码行的特定校验样式规则?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (70)

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

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

提问于
用户回答回答于

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

也可以看看

<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现在提供的另一种方法是通过@SuppressWarnignsjava注释来抑制违规。为此,你需要在配置文件中添加新模块(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:”前缀是可选的(但建议),参数名称必须全部小写

用户回答回答于

如果你更愿意使用注释来选择性地消除规则,则现在可以使用@SuppressWarnings注释,从Checkstyle 5.7开始(并由Checkstyle Maven插件2.12+支持)。

首先,在你checkstyle.xmlSuppressWarningsHolder模块中添加TreeWalker

<module name="TreeWalker">
    <!-- Make the @SuppressWarnings annotations available to Checkstyle -->
    <module name="SuppressWarningsHolder" />
</module>

接下来,启用SuppressWarningsFilter那里:

<!-- Filter out Checkstyle warnings that have been suppressed with the @SuppressWarnings annotation -->
<module name="SuppressWarningsFilter" />

现在,你可以注释例如你想从某个Checkstyle规则中排除的方法:

@SuppressWarnings("checkstyle:methodlength")
@Override
public boolean equals(Object obj) {
    // very long auto-generated equals() method
}

checkstyle:参数中的前缀@SuppressWarnings是可选的,但我喜欢它作为警告的来源提醒。

最后,如果你使用的是Eclipse,它会抱怨这个参数不为人知:

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

如果你喜欢,可以在首选项中禁用此Eclipse警告:

Preferences:
  Java
  --> Compiler
  --> Errors/Warnings
  --> Annotations
  --> Unhandled token in '@SuppressWarnings': set to 'Ignore'

扫码关注云+社区