ここでの内部クラスとは、次のようなMyAsyncTaskやMyAdapterです。
public class HogeFragment extends Fragment {
private List<MyData> list;
private void hoge() {
}
class MyAsyncTask extends AsyncTask<〜> {
listを参照したり、listを変更したり、
HogeFragment.this.hoge();
}
}
Code language: PHP (php)
public class HogeFragment extends Fragment {
private List<MyData> list;
private void hoge() {
}
class MyAdapter extends ListView.Adapter<〜> {
listを参照したり
HogeFragment.this.hoge();
}
}
Code language: PHP (php)
外部クラスHogeFragmentのメンバー変数やメソッドを、MyAsyncTaskやMyAdapterで参照・操作したいので、内部クラスにしています。
さて、内部クラスの問題は、呼び出し側(外部クラス)との関係がわかりにくいことです。
別ファイルのクラスになっていれば、呼び出し側とクラスの関係は、コンストラクタの引数やsetXXXの引数を確認して、呼び出し側のコードを読むことで、だいたいわかります。
内部クラスの場合は、外部クラスのどのメンバー変数を参照・更新しているのか、どのメソッドを呼んでいるのか、内部クラスのコードを全て読む必要があります。
内部クラスをリファクタして、別ファイルにしようとしても、予想外にたいへんな作業ですし、デグレの可能性もあります。
最近、あるアプリのアイコン一覧をRecyclerViewに置き換えました。修正前UIのadapterが内部クラスで書いてありました。慎重に読みながら、新UIのRecyclerViewのadapterは別ファイルにしました。