敢えて規約を破るケース(Checkstyleの警告抑制)

先日の日経ソフトウエア記事で、「規約は大事だが、可読性や保守性を高めるためにあえて例外的に規約を破るケースもある」ということを説明しました。

しかし、Checkstyleは情け容赦なく、違反を摘発します。

数が少ないうちは良いのですが、多くなってくると「無視すると決めた警告」に「大事な警告」が埋もれて、気づくべき違反に気づかなくなってきます。

そこで、checkstye.xml を少し編集してみましょう。TreeWalkerモジュールの子にFileContentsHolderモジュールを追加します。

…
<module name="Checker">
  <property name="severity" value="warning"/>
  <module name="TreeWalker">
    <!-- 追加ここから… -->
    <module name="FileContentsHolder"/>
    <!-- …追加ここまで -->
    <module name="JavadocMethod">
…

そしてファイルの最後の方に以下のモジュールを追加します。

…
  <module name="Translation"/>
  <!-- 追加ここから… -->
  <module name="SuppressionCommentFilter"/>
  <module name="SuppressWithNearbyCommentFilter">
    <property name="commentFormat" value="CHECKSTYLE IGNORE THIS LINE"/>
    <property name="checkFormat" value=".*"/>
    <property name="influenceFormat" value="0"/>
  </module>
  <!-- …追加ここまで -->
</module>
<!-- [EOF] -->

これにより、コード内にコメントを書くことによってCheckstyleの警告を抑制できます。以下のコードは、通常であれば「'123' はマジックナンバーです。」というお叱りを受けるところですが、Checkstyleの警告がこの行だけ抑制されます。

System.out.println(123); // CHECKSTYLE IGNORE THIS LINE

さらに、数行の範囲にわたって抑制したい場合は、以下のように書くこともできます。

// CHECKSTYLE:OFF
System.out.println(123);
System.out.println(456);
System.out.println(789);
// CHECKSTYLE:ON

まぁ、乱用厳禁な訳ですが、上手く付き合っていけば有用な機能だと思います。