kotlinのdata classで定義するプロパティと、コンストラクタ引数を変えたい場面がある場合に、コンストラクタとイニシャライザを使い分けて実現する方法について記載していきたいと思います。
ちょっと何を言っているか分からないですが以下の例を見てもらえると分かると思います。
[おさらい] data classとは
data classを作成する場合、コンストラクタにプロパティを定義する事でパラメータへのゲッターやセッターなどを自動で定義してくれました。
data class Addition(val paramA: Int, val paramB: Int, val result: Int)
paramAとparamBの足し算の結果をresultとして持ちたいので、このクラスをインスタンス化しようとすると
val addition = Addition(85, 23, 108)
val resStr = addition.result.toString() // resStrは108
となります。
ですが、これだと結果も自分で計算して格納しているため面倒です。2つのパラメータを渡したら自動で足し算結果を格納して欲しいです。
そこで、コンストラクタとイニシャライザの登場です。
[おさらい] コンストラクタとイニシャライザ
実は、コンストラクタとイニシャライザにはプライマリとセカンダリがあり、以下の順番で呼び出されます。
1.プライマリコンストラクタ
2.プライマリイニシャライザ
3.セカンダリコンストラクタ
4.セカンダリイニシャライザ
これらをコードで示すと以下のようになります。
data class sample(プライマリコンストラクタ) {
init {
プライマリイニシャライザ
}
constructor(セカンダリコンストラクタ) : this() {
セカンダイニシャライザ
}
data classにコンストラクタとイニシャライザを使う
paramAとparamBと自分で計算した結果のresultを渡すのではなく、コンストラクタとイニシャライザを駆使する事で、2つのパラメータを渡すと足し算した結果が自動でresultに格納されるようなdata classを定義したい場合は以下のように書きます。
data class Addition(val paramA: Int, val paramB: Int, var result: Int) {
constructor (paramA: Int, paramB: Int) : this(paramA, paramB, 0) {
result = paramA + paramB
}
}
使い方は以下のようになります。
val addition = Addition(85, 23)
val resStr = addition.result.toString() // resStrは108
セカンダリコンストラクタの引数でインスタンス化すると、プライマリコンストラクタで定義した各種プロパティが設定された後、セカンダリイニシャライザによって足し算結果をresultに格納しています。
これで、2つのパラメータを渡しただけで足し算結果を自動で格納できるようになりました。
さいごに
このようなコンストラクタとイニシャライザのテクニックを応用する事で、データクラスの定義とそれをインスタンス化する際のIFに自由度が持たせられるようになりますので是非実践してみて下さい!