Pocket

ここでの内部クラスとは、次のようなMyAsyncTaskやMyAdapterです。

public class HogeFragment extends Fragment {
    private List<MyData> list;
    private void hoge() {
    }

    class MyAsyncTask extends AsyncTask<〜> {
        listを参照したり、listを変更したり、
        HogeFragment.this.hoge();
    }
}
public class HogeFragment extends Fragment {
    private List<MyData> list;
    private void hoge() {
    }

    class MyAdapter extends ListView.Adapter<〜> {
      listを参照したり
      HogeFragment.this.hoge();
   }
}

外部クラスHogeFragmentのメンバー変数やメソッドを、MyAsyncTaskやMyAdapterで参照・操作したいので、内部クラスにしています。

さて、内部クラスの問題は、呼び出し側(外部クラス)との関係がわかりにくいことです。

別ファイルのクラスになっていれば、呼び出し側とクラスの関係は、コンストラクタの引数やsetXXXの引数を確認して、呼び出し側のコードを読むことで、だいたいわかります。

内部クラスの場合は、外部クラスのどのメンバー変数を参照・更新しているのか、どのメソッドを呼んでいるのか、内部クラスのコードを全て読む必要があります。

内部クラスをリファクタして、別ファイルにしようとしても、予想外にたいへんな作業ですし、デグレの可能性もあります。

最近、あるアプリのアイコン一覧をRecyclerViewに置き換えました。修正前UIのadapterが内部クラスで書いてありました。慎重に読みながら、新UIのRecyclerViewのadapterは別ファイルにしました。