Как отключить конкретное правило контрольного стиля для определенной строки кода? - PullRequest
165 голосов
/ 26 октября 2010

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

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

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

Ответы [ 6 ]

266 голосов
/ 26 октября 2010

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

59 голосов
/ 21 марта 2014

Если вы предпочитаете использовать аннотации для выборочного молчания правил, теперь это возможно с помощью аннотации @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 ("стиль проверки: длина метода")

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

Preferences:
  Java
  --> Compiler
  --> Errors/Warnings
  --> Annotations
  --> Unhandled token in '@SuppressWarnings': set to 'Ignore'
32 голосов
/ 18 февраля 2012

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

Например

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

Чтобы настроить фильтр так, чтобы CHECKSTYLE IGNOREcheck 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

2 голосов
/ 22 апреля 2016

В каждом ответе на 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>

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

1 голос
/ 18 августа 2017
<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

Подробнее

1 голос
/ 03 ноября 2016

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

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

...