PMDユーザーとして回答、「Javaプログラマであるかを見分ける10の質問」

Javaプログラマであるかを見分ける10の質問という人気記事を読んでいたら、最近お気に入りのPMDを思いだしたので、その視点でなんとなく回答してみる。

1. ==演算子とequalsメソッドの違いは何か?

==演算子でobjectを比較するようなコードをうっかり書くと、PMDに怒られてしまうので止めた方がいい(CompareObjectsWithEquals)。
なお、equalsメソッドをoverrideする場合、hashCodeも同時にoverrideしないとPMDに怒られてしまうので注意(OverrideBothEqualsAndHashcode)。面倒なので、equalsはoverrideしない方がいいと思う。

2. 文字列の+演算子による連結とStringBuilderを使った連結の違いを説明せよ。

文字列を+演算子で連結するコードを書くと、PMDに怒られてしまう(UseStringBufferForStringAppends)。
でもよけいなお世話なので、ルールごとoffにした方がいいと思う。'+'を使った方が読みやすい。

3. Listのようにジェネリクス型を使う主たる目的は何か?

Vectorなどを素で使うと、PMDなど使わずともEclipseに怒られてしまうので、ジェネリクス型を使った方がいい。

Vector is a raw type. References to generic type Vector should be parameterized

しかし、ジェネリクス型を使えない環境の場合(auオープンアプリを作る場合とか)には、こんな事を言われても単なるイヤミだ。こんな指摘はoffにしよう。
offにする手順。
Project->Properties->JavaCompiler->Generic types->Usage of a raw type

4. オブジェクトがガベージコレクションGC)される主たる条件は何か?

System.gc()とか書いておけば、そこでGCが走るはずだ。ただし、この記述はPMDが激怒するので避けた方がいいと思う(DoNotCallGarbageCollectionExplicitly、警告でなくエラー判定になる)。

5. チェック例外と非チェック例外の違いを型と例外処理の観点で説明せよ。

'catch Throwable'とか書いてしまえば、全部平等。実際にcatchできるかどうかは気にしない。しかし、本当にそんなことを書くとPMDに怒られる(AvoidCatchingThrowable)。
PMDに言われなくても書かないよ・・・と思いきや、業務用のコード中で見たことも(略)

6. フィールドのアクセス修飾子をprivateにしgetter/setterメソッドを提供する事でフィールドを参照する設計方針を取る主な理由を説明せよ

publicのインスタンスフィールドを定義すると、CheckStyleに怒られるので、真面目にgetter/setterメソッドを提供する方が良い。PMDでも怒られたような気がするんだけど、今やってみると何も出なかった。勘違いかな?

7. NullPointerExceptionが発生するのは主にどういう状況か?

objectにnullを代入するようなコードを書くと、PMDが怒る(NullAssignment)。その警告を無視して手抜きコーディングを続行すれば、NullPointerExceptionが発生する状況を招く。ちゃんとNull Objectパターン等で対処しよう。自分には重荷なので、このルールはoffにしてるけど。

8. オーバーロードとオーバーライドの違いは何か?

finalizeメソッドを例に取って述べる。
finalizeメソッドをオーバーロードすると、PMDに怒られる(FinalizeOverloaded)。
finalizeメソッドをオーバーライドする場合、中身が空だったりすると、PMDに怒られる(EmptyFinalizer)。

9. コンストラクタとは何か?

たとえば、全メンバがstaticなクラスを作った場合、そのクラスをインスタンス化する必要はない。間違ってインスタンス化しないように、誰も呼べないprivateコンストラクタを作っておこう。そうすれば、PMDに'UseSingleton'のルールでお節介を焼かれることもない。

10. インターフェイスを利用する目的を1つ説明せよ

Vectorなどをフィールドの型にすると、PMDに怒られる(LooseCoupling)。

Avoid using implementation types (i.e., HashSet); use the interface (i.e, Set) instead

しかし、'Collection'などのinterfaceが用意されてない場合もある(auオープンアプリを作る場合とか)。この指摘はイヤミにしか聞こえない。ルールごとoff。