算譜王におれはなる!!!!

偏りはあると思うけど情報技術全般についてマイペースに書くよ。

Kotlinのオブジェクト式とオブジェクト宣言

※下記URLのサイトを参考にしました。英語、または技術的な知識が至らず、内容に誤りが含まれるおそれがありますので、ご了承ください。
※本エントリの8割は参考サイトの翻訳です。残りの2割は私の解釈で加筆や変更を施した構成です。

参考サイト http://confluence.jetbrains.net/display/Kotlin/Object+expressions+and+Declarations

新しいサブクラスを明示的に宣言することなしに、クラスをわずかに変更したオブジェクトを生成する必要があることが、時々あります。Java匿名内部クラス(anonymous inner class)でこのケースを対処します。Kotlinはオブジェクト式オブジェクト宣言でこのコンセプトを少し一般化します。

オブジェクト式

何かしらの型を継承した匿名クラスのオブジェクトは次のように生成します。

fun main(args : Array<String>) {
  val japanese = object : Greeter {
    override fun greet() = println("こんにちは")
  }
  
  japanese.greet() //「こんにちは」が表示される
}

trait Greeter {
  fun greet()
}

スーパークラスがコンストラクタを持つ場合は、適切なコンストラクタのパラメータを渡さなければなりません。多重継承の場合は、object : に続けてカンマで区切ってスーパークラスを指定します。

fun main(args : Array<String>) {
  val ab = object : A(1), B {
    override fun foo() {
      //・・・
    }
  }
}

open class A(val a : Int)

trait B {
  fun foo()
}

万一「単なるオブジェクト」が必要な場合は、次のように簡単にかけます。

val foo = object {
  var p : Int = 0
  
  fun doSomething() {
    //・・・
  }
}

オブジェクト宣言

シングルトンは非常に便利なパターンですが、Kotlinでは簡単にシングルトンを宣言できます。

object Singleton {  
  fun hello() {
    println("Hello")
  }
}

これをオブジェクト宣言(object declaration)と呼びます。これを変数に割り当てることはできませんが、名前を使って参照することができます。また、スーパークラスを持つことができます。

open class ABC()

object Singleton : ABC() {  
  fun hello() {
    println("Hello")
  }
}

fun main(args : Array<String>) {
  Singleton.hello() // Helloが表示される
}

オブジェクト式とオブジェクト宣言のセマンティカルな違い

オブジェクト式とオブジェクト宣言の間には、1つ重要なセマンティカルな違いがあります。

  • オブジェクト宣言は、最初のアクセス時に初期化されます。
  • オブジェクト式は、使用される場所で即時に実行、初期化されます。