PMD Javaルール ver 6.35.0 ⇒ 6.47.0 差分

PMD Javaルール ver 6.35.0⇒6.47.0

これまでまとめてきたPMDルールは6.35.0のものだったので 6.35.0から今の最新の6.47.0までのJavaルールの差分についてまとめます。

ver 6.36.0(2021-06-26)

ルール名の変更

カテゴリ 変更前ルール名 変更後ルール名
Error Prone BadComparison ComparisonWithNaN

ルール内容:Double.NaN との等価比較をしていないか

// NG例
boolean x = (y == Double.NaN);

ルール設定例

<rule ref="category/java/errorprone.xml/ComparisonWithNaN" />

ver 6.37.0(2021-07-31)

Java17サポート

新規ルール

カテゴリ 追加ルール名 ルールの概要
Best Practices PrimitiveWrapperInstantiation プリミティブラッパーコンストラクタを使用していないか
Best Practices SimplifiableTestAssertion より具体的なアサーションメソッドを使用して簡略化できるようなテストアサーションがないか
Error Prone ReturnEmptyCollectionRatherThanNull コレクションを返すメソッド (配列、コレクション、マップなど) では、Nullではなく空のコレクションを返す

PrimitiveWrapperInstantiation

プリミティブラッパーコンストラクタを使用していないか
ラッパークラスのコンストラクタはJava 9以降非推奨であり、使用するべきではない

public class Foo {
    private Integer ZERO = new Integer(0);      // NG
    private Integer ZERO1 = Integer.valueOf(0); // OK
    private Integer ZERO1 = 0;                  // これでも可
}
ルール設定例
<rule ref="category/java/bestpractices.xml/PrimitiveWrapperInstantiation" />

SimplifiableTestAssertion

より具体的なアサーションメソッドを使用して簡略化できるようなテストアサーションがないか
このルールは、現状テストクラス内でのみ適用される。
非推奨となった以下のルールの代わりとなる。  

  • UseAssertEqualsInsteadOfAssertTrue  
  • UseAssertNullInsteadOfAssertTrue
  • UseAssertSameInsteadOfAssertTrue
  • UseAssertTrueInsteadOfAssertEquals
  • SimplifyBooleanAssertion
import org.junit.Test;
import static org.junit.Assert.*;

class SomeTestClass {
    Object a,b;
    @Test
    void testMethod() {
        assertTrue(a.equals(b)); // assertEquals(a, b);を使用するべき
        assertTrue(!a.equals(b)); // assertNotEquals(a, b);を使用するべき

        assertTrue(!something); // assertFalse(something);を使用するべき
        assertFalse(!something); // assertTrue(something);を使用するべき

        assertTrue(a == b); // assertSame(a, b);を使用するべき
        assertTrue(a != b); // assertNotSame(a, b);を使用するべき

        assertTrue(a == null); // assertNull(a);を使用するべき
        assertTrue(a != null); // assertNotNull(a);を使用するべき
    }
}
ルール設定例
<rule ref="category/java/bestpractices.xml/SimplifiableTestAssertion" />

ReturnEmptyCollectionRatherThanNull

コレクションを返すメソッド (配列、コレクション、マップなど) では、Nullではなく空のコレクションを返す。
すべての結果をNULLチェックする必要がなくなり、不用意なNullPointerExceptionを回避することができる。

public class Example {
    public int[] badBehavior() {
        return null; // nullを返すべきではない
    }

    public String[] bonnePratique() {
        return new String[0]; // OK
    }
}
ルール設定例
<rule ref="category/java/errorprone.xml/ReturnEmptyCollectionRatherThanNull" />

ルール名の変更

カテゴリ 変更前ルール名 変更後ルール名
Error Prone MissingBreakInSwitch ImplicitSwitchFallThrough

ルール内容:break文が記述されていないswitch文がないか 各ケースでbreakまたはreturnステートメントがないスイッチステートメントは、問題のある動作を示す可能性がある。

// NG例
public void doSomething() {
    int status = 1;
    switch (status) {
    case 1:
        System.out.println("1");
    case 2:
        System.out.println("2");
        break;      
    }
}

ルール設定例

<rule ref="category/java/errorprone.xml/ImplicitSwitchFallThrough" />

非推奨となったルール

新ルール SimplifiableTestAssertion 追加に伴い非推奨になったルール

  • UseAssertEqualsInsteadOfAssertTrue
  • UseAssertNullInsteadOfAssertTrue
  • UseAssertSameInsteadOfAssertTrue
  • UseAssertTrueInsteadOfAssertEquals
  • SimplifyBooleanAssertion

新ルール ReturnEmptyCollectionRatherThanNull 追加に伴い非推奨になったルール

  • ReturnEmptyArrayRatherThanNull

新ルール PrimitiveWrapperInstantiation 追加に伴い非推奨になったルール

  • BooleanInstantiation
  • ByteInstantiation
  • IntegerInstantiation
  • LongInstantiation
  • ShortInstantiation

PMD7で追加されるルール UnnecessaryBoxing のために非推奨となったルール

  • UnnecessaryWrapperObjectCreation

ver 6.38.0(2021-08-28)

変更なし


ver 6.39.0(2021-09-25)

変更なし


ver 6.40.0(2021-10-30)

ルールの変更

カテゴリ 変更されたルール 変更概要
Code Style ClassNamingConventions プロパティutilityClassPatternのデフォルト値変更

ルール内容:クラスの命名規則を守っているか

プロパティutilityClassPatternのデフォルト値が「[AZ][a-zA-Z0-9]+(Utils?|Helper|Constants)」から「[A-Z][a-zA-Z0-9]*」へと変更となり、ユーティリティクラスの名前の末尾にUtilまたはHelperまたはConstantsを付ける必要はなくなった


ver 6.41.0(2021-11-27)

変更なし


ver 6.42.0(2022-01-29)

新規ルール

カテゴリ 追加ルール名 ルールの概要
Code Style FinalParameterInAbstractMethod インターフェースまたは抽象メソッドでfinalとして宣言されているパラメーターがないか

FinalParameterInAbstractMethod

インターフェースまたは抽象メソッドでfinalとして宣言されているパラメーターがないか
インターフェースまたは抽象メソッドでfinalとして宣言しても、実装がそれを尊重しないことを選択する可能性があるため、無意味となる。

public interface MyInterface {
  void process(final Object arg); // finalを付けない
}

ルール設定例

<rule ref="category/java/codestyle.xml/FinalParameterInAbstractMethod" />

ver 6.43.0(2022-02-26)

変更なし


ver 6.44.0(2022-03-27)

Java18サポート


ver 6.45.0(2022-04-30)

ルールの変更

カテゴリ 変更されたルール 変更概要
Best Practices UnusedPrivateField プロパティignoredFieldNamesの追加

ルール内容:使用されていないプライベートフィールドがないか

プロパティignoredFieldNamesが追加となった

// NG例
public class Sample {
    private String t = "t"; //使用しないなら削除する

    void doSomething(String p) {
        String s = "a";
    }
}

プロパティ

名前 デフォルト値 説明 複数指定
ignoredAnnotations lombok.Setter| lombok.Getter| lombok.Builder| lombok.Data| lombok.RequiredArgsConstructor| lombok.AllArgsConstructor| lombok.Value| lombok.NoArgsConstructor| java.lang.Deprecated| javafx.fxml.FXML| lombok.experimental.Delegate| lombok.EqualsAndHashCode このルールで無視する必要がある注釈タイプの完全修飾名。 「|」区切り
ignoredFieldNames serialVersionUID| serialPersistentFields 未使用チェックを無視するフィールド名 「|」区切り

ルール設定例

<!-- プロパティ設定なし -->
<rule ref="category/java/bestpractices.xml/UnusedPrivateField" />

<!-- プロパティ設定あり -->
<rule ref="category/java/bestpractices.xml/UnusedPrivateField">
    <properties>
        <property name="ignoredAnnotations" value="lombok.Setter|lombok.Getter|lombok.Builder|lombok.Data|lombok.RequiredArgsConstructor|lombok.AllArgsConstructor|lombok.Value|lombok.NoArgsConstructor|java.lang.Deprecated|javafx.fxml.FXML|lombok.experimental.Delegate|lombok.EqualsAndHashCode" />
        <property name="ignoredFieldNames" value="serialVersionUID|serialPersistentFields" />
    </properties>
</rule>

ver 6.46.0(2022-05-28)

新規ルール

カテゴリ 追加ルール名 ルールの概要
Code Style EmptyControlStatement 空の制御文および初期化子が存在していないか
Code Style UnnecessarySemicolon 不要なセミコロンがないか

EmptyControlStatement

空の制御文および初期化子が存在していないか
チェックされるコード構成は以下の通り

非推奨となった以下のルールの代わりとなる。

  • EmptyFinallyBlock
  • EmptyIfStmt
  • EmptyInitializer
  • EmptyStatementBlock
  • EmptySwitchStatements
  • EmptySynchronizedBlock
  • EmptyTryBlock
  • EmptyWhileStmt
// NG例
class Foo {
    {
        if (true); // ifの処理がない
        if (true) { // ifの処理がない
        }
    }

    {} // 空の初期化処理
}
ルール設定例
<rule ref="category/java/codestyle.xml/EmptyControlStatement" />

UnnecessarySemicolon

不要なセミコロンがないか

class Foo {
    {
        toString();; // セミコロンは1つで良い
    }
}; // ここのセミコロンは不要
ルール設定例
<rule ref="category/java/codestyle.xml/UnnecessarySemicolon"/>

非推奨となったルール

新ルール EmptyControlStatement 追加に伴い非推奨になったルール

  • EmptyFinallyBlock
  • EmptyIfStmt
  • EmptyInitializer
  • EmptyStatementBlock
  • EmptySwitchStatements
  • EmptySynchronizedBlock
  • EmptyTryBlock
  • EmptyWhileStmt

新ルール UnnecessarySemicolon 追加に伴い非推奨になったルール

  • EmptyStatementNotInLoop

ver 6.47.0(2022-06-25)

変更なし


ver6.35.0のPMDの各カテゴリのルールもまとめているのでよかったらご覧ください。

Best Practiceカテゴリのまとめはこちら: olafnosuke.hatenablog.com

Code Styleカテゴリのまとめはこちら: olafnosuke.hatenablog.com

Designカテゴリのまとめはこちら: olafnosuke.hatenablog.com

Documentationカテゴリのまとめはこちら: olafnosuke.hatenablog.com

Error Proneカテゴリのまとめはこちら: olafnosuke.hatenablog.com

Multithreadingカテゴリのまとめはこちら: olafnosuke.hatenablog.com

Performanceカテゴリのまとめはこちら: olafnosuke.hatenablog.com

Securityカテゴリのまとめはこちら: olafnosuke.hatenablog.com