Как отключить определенное правило checkstyle для определенной строки кода?

У меня есть checkstyle правило проверки, настроенное в моем проекте, которое запрещает определять методы класса с более чем тремя входными параметрами. Правило отлично работает для моих классов, но иногда мне приходится расширять сторонние классы, которые не подчиняются этому конкретному правилу.

Есть ли возможность проинструктировать "checkstyle", что какой-то метод следует игнорировать без внимания?

Кстати, у меня была своя оболочка checkstyle: qulice.com (см. Строгий контроль качества Java-кода)

Ответ 1

Проверьте использование supressionCommentFilter на http://checkstyle.sourceforge.net/config_filters.html#SuppressionCommentFilter. Вам нужно будет добавить модуль в ваш checkstyle.xml

<module name="SuppressionCommentFilter"/>

и это настраивается. Таким образом, вы можете добавить комментарии к своему коду, чтобы отключить контрольный стиль (на разных уровнях), а затем снова включить его, используя комментарии в вашем коде. Э.Г.

//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, заключается в подавлении нарушений с помощью java-аннотации @SuppressWarnings. Для этого вам необходимо добавить два новых модуля (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:" является необязательным (но рекомендуется). Согласно документам, имя параметра должно быть написано строчными буквами, но практика показывает, что любой случай работает.

Ответ 2

Если вы предпочитаете использовать аннотации для выборочного молчания правил, теперь это возможно с помощью аннотации @SuppressWarnings, начиная с Checkstyle 5.7 (и поддерживается плагином Checkstyle Maven 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: в аргументе к @SuppressWarnings является необязательным, но мне нравится напоминание, откуда пришло это предупреждение. Имя правила должно быть в нижнем регистре.

Наконец, если вы используете Eclipse, он будет жаловаться на то, что аргумент ему неизвестен:

Unsupported @SuppressWarnings("checkstyle:methodlength")

Вы можете отключить это предупреждение Eclipse в настройках, если хотите:

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

Ответ 3

Что также хорошо работает, SuppressWithNearbyCommentFilter, который использует отдельные комментарии для подавления аудиторских событий.

Например

// CHECKSTYLE IGNORE check FOR NEXT 1 LINES
public void onClick(View view) { ... }

Чтобы настроить фильтр таким образом, чтобы CHECKSTYLE IGNORE проверял 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

Ответ 4

В каждом ответе, относящемся к SuppressWarningsFilter, отсутствует важная деталь. Вы можете использовать только строчный идентификатор, если он определен как таковой в вашем checkstyle-config.xml. Если нет, вы должны использовать оригинальное имя модуля.

Например, если в моем checkstyle-config.xml у меня есть:

<module name="NoWhitespaceBefore"/>

Я не могу использовать:

@SuppressWarnings({"nowhitespacebefore"})

Я должен, однако, использовать:

@SuppressWarnings({"nowhitespacebefore"})

Чтобы первый синтаксис работал, checkstyle-config.xml должен иметь:

<module name="NoWhitespaceBefore">
  <property name="id" value="nowhitespacebefore"/>
</module>

Это то, что сработало для меня, по крайней мере, в версии 6.17 CheckStyle.

Ответ 5

У меня возникли трудности с ответами выше, возможно, потому что я устанавливал предупреждения checkStyle как ошибки. Что работало: SuppressionFilter: http://checkstyle.sourceforge.net/config_filters.html#SuppressionFilter

Недостатком этого является то, что диапазон строк хранится в отдельном файле suppresssions.xml, поэтому незнакомый разработчик не может сразу установить соединение.

Ответ 6

<module name="Checker">
    <module name="SuppressionCommentFilter"/>
    <module name="TreeWalker">
        <module name="FileContentsHolder"/>
    </module>
</module>

Чтобы настроить фильтр для подавления событий аудита между комментарием, содержащим строку BEGIN GENERATED CODE, и комментарий, содержащий строку END GENERATED CODE:

<module name="SuppressionCommentFilter">
  <property name="offCommentFormat" value="BEGIN GENERATED CODE"/>
  <property name="onCommentFormat" value="END GENERATED CODE"/>
</module>

//BEGIN GENERATED CODE
@Override
public boolean equals(Object obj) { ... } // No violation events will be reported

@Override
public int hashCode() { ... } // No violation events will be reported
//END GENERATED CODE

Подробнее