私は最近、もともとJava 1.3で書かれた大規模なレガシープロジェクトにソナーを導入しました。
生のコレクションなどを使用するコードをジェネリックを使用するように徐々に移行しています。ソナーで進行状況を追跡できればよいのですが、生のコレクションの使用を検出するためのすぐに使えるルールはないようです。
既存のソリューションはありますか? それとも、pmd/checkstyle でカスタム ルールを作成する必要がありますか?
私は最近、もともとJava 1.3で書かれた大規模なレガシープロジェクトにソナーを導入しました。
生のコレクションなどを使用するコードをジェネリックを使用するように徐々に移行しています。ソナーで進行状況を追跡できればよいのですが、生のコレクションの使用を検出するためのすぐに使えるルールはないようです。
既存のソリューションはありますか? それとも、pmd/checkstyle でカスタム ルールを作成する必要がありますか?
ソナーでこれもキャッチしたいので、同じものを探していました。
List myList = new ArrayList();
Dennis S が言及しているルールは、次の状況をキャッチするためのものであるため、適用されません ( http://coding.tocea.com/java/gc_unchecked_type_in_generic_call/によると) 。
StringBuilder myText = new StringBuilder();
...
List<String> myList = new ArrayList<String>();
boolean containsMyText = myList.contains(someText);
collection.contains()
型指定されたコレクションであっても、メソッドは Object パラメーターを受け取るため、コードはコンパイルされます。ただし、オブジェクトの型が正しくなく、型付きコレクションmyText
に追加できないため、これは無関係なチェックであり、常に false を返します。myList
私が見たところ、カスタム ルールを作成する必要があるようです。
うーん、GC_UNCHECKED_TYPE_IN_GENERIC_CALL は非推奨になりました。推奨される代替品である S2175 は、オブジェクト型のメソッド (つまり、remove(Object)) が呼び出されているかどうかのみをチェックします。
したがって、GC_UNCHECKED_TYPE_IN_GENERIC_CALL も S2175 も、たとえば「HashMap x」ではなく「HashMap x」に対して警告を発行しないようです。
これにルールがないように見えるのは奇妙に思えます...