Java8でFindBugsを使ってみる


はじめに

2014/9/5時点での、FindBugsのJava8対応状況について調べてみました。

本体

3.0.0から対応されたようです。
http://findbugs.sourceforge.net/

Eclipseプラグイン

Marketplaceから最新版をインストールすれば、3.0.0対応のものが入ります。

Mavenプラグイン

対応されているようです。
http://mojo.codehaus.org/findbugs-maven-plugin/
なので、JenkinsでJob回してレポート収集、というところは出来そうですね。
試してないですが。

EclipseでJava8のコードをチェックしてみる

どういう挙動になるのか、少し試してみました。
以下、だいぶ適当ですがサンプルコード。

FindBugs確認用サンプル
public class FindBugsJava8 {

    public static void main(String[] args) {

        final List<String> personNames = new ArrayList<String>();
        personNames.add("Bob");
        personNames.add("Mark");
        personNames.add("Tom");

        final Person p = new Person("Mark");

        // Java8以前
        for (String personName : personNames) {
            if (p.equals(personName)) {
                System.out.println(personName);
            }
        }

        // Java8
        personNames.stream().filter(personName -> p.equals(personName))
                .forEach(System.out::println);
    }

    public static class Person {

        private String name;

        public Person(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }
    }
}

拡張for文での記述と、stream,lambdaの記述で大体同じ処理をさせてます。
p.equals(personName)がバグ検知されそうですね。

このコードのチェック結果は以下の通りでした。

バグの詳細

lambdaの中の記述は検出されない?ように見えました。
記述が悪いのか、設定が悪いのか、対応されていないのか、、、
もうちょっと使ってみないとよく分からないですね。
何か分かったらまた追記しようと思います。

ひとまず、チェックが出来るようになったというだけでもありがたいですよね。