■データクラス
処理を持たないデータだけを保持するクラス
classの前にdataをつける
{}はいらない処理を持たないので(書く事もできる。)
コンストラクタで変数を持たせる。
定数だけを持たせるクラスになる。
data class Hoge(val name: String, val age: Int)
■データクラスを定義する条件
●コンストラクタが1つ以上の引数を持つ
●コンストラクタの引数は全てvar/valを付与してプロパティの宣言とする。
●abstrct/open/sealed/innerにすることはできない。
■equalsメソッド
同値性のチェック
違うインスタンス同士でコンストラクタの値が同じ
中身のnum の変数は違う
この条件でもコンストラクタの値が同じならequalsメソッドでtrueになる。
data class Hoge(var name:String = "") {
var num:Int = 0
}
val a = Hoge("マイケル")
a.num = 40
val b = Hoge("マイケル")
b.num = 50
println(a == b) //結果:true
■toStringメソッド
▼文字列表現
println関数を使ったら暗黙的に呼び出される。
▼データクラスのオブジェクトを文字列化すると
「データクラス名(プロパティ=値)」
というように出力される。
つまりprintinでデータクラスを定義すると文字列化され
「データクラス名(プロパティ=値)」
というように出力される。
data class Hoge(var name:String = "") {
var num:Int = 0
}
val a = Hoge("マイケル")
a.num = 40
//コンストラクタがIntでも同じ
println(a) //結果 : Hoge(name=マイケル)
equalsメソッドとtoStringメソッドもコンストラクタで定義された値のみを
対象としている。
■データクラスに定義されたメソッドは
コンストラクタで定義されたプロパティのみ対象にしている。
■componentN(分割代入)
プロパティの値を個々の変数に分解する。
val a = Hoge("マイケル","所長","28")
val (name,job,age) = a
//結果
name=マイケル
job=所長
age=28
内部的には以下のようになっている
componennt1等の数字の部分は引数の順番になっている。
val a = Hoge("マイケル","所長","28")
val name = a.component1()
val job = a.component2()
val age = a.component3()
データクラスにはcomponentNが実装されている。
分割代入が可能
data class(val name:String, val job:String, val age:Int)
val a = Hoge("マイケル","所長","28")
val (name,job,age) = a
printin(age) //28
■copy(オブジェクトの複製)
特定のプロパティの値だけを変更してコピーしている。
data class(val name:String, val job:String, val age:Int)
val a = Hoge("マイケル","所長","28")
//特定のプロパティの値だけを変更している。
val b = a.copy(age=40)
println(b)
//結果: Hoge(name=マイケル,job=所長,age=40)