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
空の制御文および初期化子が存在していないか
チェックされるコード構成は以下の通り
- tryブロック
- finallyブロック
- switchステートメント
- synchronizedステートメント
- ifステートメント
- ループ文:while, for, do ... while
- 初期化子
- ステートメントとして使用されるブロック
非推奨となった以下のルールの代わりとなる。
- 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