金田著「はじめてのandroidプログラミング 第5版」を使って、勉強しています。
「第8章タイマーを使ってスライドショーを実装する」で使っているテクニックを解析してみます。
今日のテーマは、ネストした(入れ子になった)クラスを外に出してみるです。初心者にとって、クラスの中にクラスが入れ子になって入っていると、違和感を感じませんか。そこでネストしたクラスを外に出してみます。
以下、本書を持っている前提で説明します。本書を使って勉強中の方、一緒に勉強しましょう。
0.前提
p224まで写経が済んでいるとします。
1.原型
p224まで写経が済んでいる状態のコードを示します。説明に不要な部分は、著作権に配慮して省略しています。
MainActivityクラスの中に、MyAdapterクラスがネスト(入れ子)になっています。これはMyAdapterクラスがMainActivityクラスでしか使わないためです。この説明は、本書には書かれていないようです。参考としてJosh Skeen著 吉川監訳 「Kotlinプログラミング」のp242に書かれています。
class MainActivity : AppCompatActivity() {
// MainActivityクラスの中にMyAdapterクラスをネスト(入れ子にする)
class MyAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {
// 省略
}
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
// 省略
binding.pager.adapter = MyAdapter(this)
}
}
2.入れ子になったクラスを外に出す
初心者には、クラスの中にクラスがあると、ぱっと見、慣れていないと違和感を感じます。このため入れ子になったMyAdapterクラスを外に出してみます。また出されたMyAdapterクラスは、ファイルの外部から見える必要がないので可視性をprivateに変更しました。この説明は和訳版kotlinリファレンスの可視性修飾子に書かれています。
class MainActivity : AppCompatActivity() {
// ネストクラス
// class MyAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {
// // 省略
// }
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
// 省略
binding.pager.adapter = MyAdapter(this)
}
}
// MyAdapterクラスをMainActivityクラスの外に出す
private class MyAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {
// 省略
}
ネストクラスは、コードの可読性、クラスの可視性(カプセル化)を高める目的で使われますが、慣れていない人は、逆に、試しにネストしたクラスを外に出して、意味を確認しながらネストクラスに慣れていきましょう。