Checkstyle Javaルール

CheckstyleのJavaルールについて1つずつまとめます

DesignForExtension

CheckStyle公式ドキュメント

検証環境

Checkstyleバージョン:10.3.3
Javaバージョン:17


チェック概要

チェック追加バージョン
Checkstyle 3.1

クラスが拡張(サブクラス作成)用に設計されているかどうかをチェックする。
このチェックでは、オーバーライド可能なメソッド (非static、非final、非abstractのpublicまたはprotectedメソッド) を持ち、空でない実装を持つクラスが検出される。

このチェックは、クラスがどんな場合でも誤用なく動作するように理想的なOOP設計に気を配るライブラリプロジェクト(アプリケーションプロジェクトではない)でのみ意味をなす。

※あるクラスが拡張用に設計されているかどうかは、作成したユーザーのみが判断可能である。このチェックは、あくまでも拡張用に設計されている可能性があるすべてのクラスを表示するだけであり、不適切なものが見つかった場合はチェックを抑制すること。

※サブクラスでオーバーライド可能なメソッドにjavadocコメントがある場合や、サブクラスでオーバーライド可能なメソッドが ignoredAnnotationsオプションで指定された1つ以上のアノテーションを持っている場合、違反はスキップされる。

プロパティ

プロパティ デフォルト値 説明 追加バージョン
ignoredAnnotations String[] After,
AfterClass,
Before,
BeforeClass,
Test
メソッドをチェックから除外するためのアノテーション(コンマ区切りで複数指定可能) 7.2
requiredJavadocPhrase Pattern ".*" 拡張用に設計されたメソッドを修飾するコメント文の正規表現 8.40

設定+チェック実行結果

プロパティ設定なし

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="DesignForExtension"/>
    </module>
</module>

チェック実行例

public class MyClassTest {
    // OK
    @Test
    public void foo() {
        final B b = new A();
        assertEquals(2, b.foo());
    }

    // NG
    public int foo2() {
        return 8;
    }
}

プロパティ設定あり

ignoredAnnotations

メソッドをチェックから除外するためのアノテーションを指定する。コンマ区切りで複数指定可能。

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="DesignForExtension">
            <property name="ignoredAnnotations" value="Override, Test"/>
        </module>
    </module>
</module>

チェック実行例

public class MyClassTest {
    // OK ignoredAnnotationsに設定したアノテーションが付与されているのでOK
    @Test
    public void foo() {
        final B b = new A();
        assertEquals(2, b.foo());
    }

    // OK ignoredAnnotationsに設定したアノテーションが付与されているのでOK
    @Override
    public int foo2() {
        return 8;
    }
}

requiredJavadocPhrase

拡張用に設計されたメソッドを修飾するコメント文の正規表現

設定ファイル記述方法

<module name="Checker">
    <module name="TreeWalker">
        <module name="DesignForExtension">
            <property name="requiredJavadocPhrase" value="This implementation"/>
        </module>
    </module>
</module>

チェック実行例

public class MyClassTest {
    // OK 
    @Test
    public void foo() {
        final B b = new A();
        assertEquals(2, b.foo());
    }

    // NG
    @Override
    public int foo2() {
        return 8;
    }
    
    // OK Javadocコメントに「requiredJavadocPhrase」で指定したコメントが記載されているのでOK
    /**
     * This implementation ...
    */
    public int foo3() {
        return 0;
    }
}