データクラス
- オブジェクト指向で、処理を持たないデータだけを保持するクラスを利用したいことがある場合、データクラスを定義する。データクラスはclassの前に「data」というキーワードをつけて定義する
- データクラスを定義する際には以下の条件を満たす必要がある
1.プライマリコンストラクタが一つ以上の引数を持つ 2.コンストラクタの引数はすべてvar/valを付与してプロパティの宣言とする 3.abstract / open / sealed / innerにすることはできない
data class User (var lastName: String, var firstName: String, var age: Int){ var occupation = "エンジニア" fun detail() = println("${lastName} ${firstName} ${age} ${occupation}") } fun main (){ val user = User("山田","太郎",44) user.occupation = "営業" user.detail() }
オブジェクト宣言
- 開発でひとつのインスタンスしか持たないようなクラスを用意したい場合、オブジェクト宣言という仕組みによって実現できる
objectオブジェクト名 {オブジェクト本体}
- クラスを宣言するかのようにオブジェクトを宣言できる
object User { var name = "山田太郎" var sex = "女性" fun show() { println("${name}は${sex}です。") } } fun main (){ User.sex = "女性" User.show() }
SAM(Single Abstract Method)インターフェース
- ひとつしか抽象メソッドを持たないインターフェースのことSAMという
object: 基底クラスorインターフェース {クラス本体}
- Androidの場合
btn.setOnClickListener(object: View.OnClickListener { overridefunonClick(view: View) { ボタンがクリックされたときの処理 } })
SAM変換
- オブジェクト式で実装するインターフェースがSAMインターフェースの場合、 ラムダ式で置き換えてよりシンプルに表現できる
ex) btn.setOnClickListener({ view: View -> クリックされたときの処理 })
コンパニオンオブジェクト
- クラス変数・クラスメソッド(Staticメンバ)を利用するための、クラス内部のオブジェクト宣言
- クラス内部でのオブジェクト宣言にcompanionキーワードをつける コンパニオンオブジェクト内で定義された変数やメソッドは、 「クラス名.変数」「クラス名.メソッド()」というように呼び出せる
class User(){ companion object detail{ //オブジェクト宣言 init{ println("初期化されたよ") } var age = 33 var name="山田太郎" fun message(){ println("${name}は${age}です") } } } fun main(){ User.detail.message() }