Androidアプリ開発 AndroidStudio FindBugs パッケージプロテクテッドにすべきフィールドを修正する

2016年08月08日(編集2016年08月08日)
このエントリーをはてなブックマークに追加

AndroidStudioでは、FindBugsを利用することができます。
この記事は、AndroidStudioのFindBugsで出現した警告の修正方法を記載した記事です。

環境はAndroid 7.0 (API level 24) です。

環境

  • OS X Yosemite
  • Oracle jdk version 1.8.0_72
  • Android Studio 2.1.2
  • android sdk 24
  • FindBugs 1.0.0

難易度

初心者向け

FindBugs

FindBugsは、Java code内のバグをさがす静的解析ツールです。
良いAndroidアプリを作るため、なるべく利用するべきのツールです。

パッケージプロテクテッドにすべきフィールド

FindBugsでパッケージプロテクテッドにすべきフィールドというバグが指摘されるケースがあります。
例えば、以下のコードで警告が表示されます。

{project_folder}/model/Menu.java
      public static final String [] COL = new String [] {"id","menu_ja","menu_en","summary_ja","summary_en","created_at","updated_at","deleted_at"};
        

上記は、テーブルの名前を格納したpublic static finalの配列です。
finalなので書き換え不可に思えますが、書き換え可能です。

Javaは、長さがゼロでない配列は書き換え可能です。 final修飾子は参照を書き換え不可にするのであって、中身を書き換え可能とするわけではありません。

では、実際に配列の中身を書き換えてみましょう。

{project_folder}/ui/MenuFragment.java
Log.d(TAG, Menu.COL[0]);
// value change 
Menu.COL[0] = "changed_id";
Log.d(TAG, Menu.COL[0]);
        

ビルドしてコンソールに出力します。

console
MainFragment: id
MainFragment: changed_id   
        

配列の中身の値が書き変わってます。

修正方法

String型の定数配列を実装したいなら、

Collections.unmodifiableList

を利用します。

{project_folder}/model/Menu.java
   -public static final String [] COL = new String [] {"id","menu_ja","menu_en","summary_ja","summary_en","created_at","updated_at","deleted_at"};


   +public static final List<String> COL = Collections
            .unmodifiableList(new LinkedList<String>() {
                {
                    add("id");
                    add("menu_ja");
                    add("menu_en");
                    add("summary_ja");
                    add("summary_en");
                    add("created_at");
                    add("updated_at");
                    add("deleted_at");
                }
            });

        

先ほどと同じように中身を書き換えてみましょう。

{project_folder}/ui/MenuFragment.java
Log.d(TAG, Menu.COL.get(0));
Menu.COL.add(0, "changed_id");
Log.d(TAG, Menu.COL.get(0));
        

ビルドしてコンソールに出力します。

console
Caused by: java.lang.UnsupportedOperationException 
at java.util.Collections$UnmodifiableList.add(Collections.java:1038)
        

書き換えに失敗しました。
FindBugsを実行して警告が消えていることも確認しましょう。

まとめ

FindBugsを使うことでバグのあるコードを減らすことができます。
コーディングの技術も向上するので、是非利用してみてください。

関連記事

タグ検索で調べてみよう

Java Android7.0 Android Studio