Factoryってなぁに〜〜!を考えてみる。
Factoryとは
Factoryは、新しいオブジェクトを生成するための方法を提供してくれるクラス
はにゃ?
Factoryを使用した実例をみてみる
- ViewModelを作成する
class MainViewModel(application: Application) : AndroidViewModel(application) {
class Factory(private val application: Application) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T {
when (modelClass) {
TopViewModel::class.java -> return MainViewModel(application) as T
else -> throw RuntimeException()
}
}
}
}
ViewModelProvider.Factoryは、ViewModelを作成するためのFactoryのインターフェイス。
Factoryは、ViewModelProvider
によって使用され、ViewModelを作成するために呼び出される。
- ViewModelを呼び出す
class MainActivity : AppCompatActivity() {
private val mainViewModel: MainViewModel by lazy {
ViewModelProvider(this, MainViewModel.Factory(application))[MainViewModel::class.java]
}
}
つまり、FactoryはViewModelの生成を手伝うクラスであり、ViewModelProviderがこのクラスを使用してViewModelを作成するということね。
細かく解説
まずは、ViewModelを作成しているコードの解説をおねがいします
- Factoryクラスは、ViewModelProviderがViewModelのインスタンスを生成する際に呼び出される。
- Factoryクラスは、どのViewModelのインスタンスを生成するかを決定するためのcreate()メソッドを実装している。
- create()メソッドは、引数として渡されたClassオブジェクトに基づいて、ViewModelのインスタンスを生成する。この例では、MainViewModelクラスを生成するために使用される。
- MainViewModelクラスのインスタンスは、applicationオブジェクトを引数にして生成される。この例では、applicationオブジェクトはFactoryクラスのコンストラクタに渡されている。
- create()メソッドは、生成されたViewModelインスタンスを返す必要があるが、戻り値の型がTとなっている。そのため、as Tというキャストが必要になる。
- create()メソッドはuncheckedキャストを使用するため、@Suppress(“UNCHECKED_CAST”)というアノテーションが必要。
- modelClassがMainViewModelクラスでない場合、RuntimeExceptionをスローする。これは、Factoryクラスが生成できるViewModelのクラスが限定されているため。
- ViewModelを呼び出しているコードの解説
ViewModelを呼び出しているコードの解説もお願いします
- MainViewModelのインスタンスを生成している。
- by lazyを使用しているため、mainViewModelプロパティが初めて呼び出されるまで、ViewModelのインスタンスは作成されない。これにより、不要なオブジェクトの生成を避け、パフォーマンスを向上させることができる。
ViewModelProvider(this, MainViewModel.Factory(application))
は、ViewModelを提供するためのファクトリークラスTopViewModel.Factory
とともに、現在のActivityとApplicationのインスタンスをtopViewModel
という変数に渡している。
- これにより、ViewModelがActivityとApplicationのライフサイクルに関連付けられ、適切なタイミングで破棄されるようになる。
[TopViewModel::class.java]
はViewModelの型を指定している。これにより、ViewModelのインスタンスが生成される。
ちょっと難しいけど、そういう書き方ってことね!
一旦、ノリで乗り切ります。