English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Kotlin オブジェクト宣言と表現

この記事では、例を通じてオブジェクト宣言(シングルトン)とオブジェクト表現について学びます。

オブジェクト宣言

シングルトンは、一つのクラスが一つのインスタンス(オブジェクト)しか持てない面向对象的パターンです。
例えば、SQLデータベースのバックエンドを持つアプリケーションを開発している場合、データベースにアクセスするための接続プールを作成し、すべてのクライアントが同じ接続を共有するようにしたい場合があります。そのためには、シングルトンクラスを使用して接続を作成し、各クライアントが同じ接続を受け取るようにします。

Kotlinは、objectキーワードを使用してオブジェクト宣言の特性を利用してシンプルにシングルトンを作成する方法を提供しています。

object SingletonExample {
    ... .. ...
    //クラス本体
    ... .. ...
}

上記のコードは、クラスの宣言とそのクラスの単一のインスタンス SingletonExample の宣言を組み合わせています。

オブジェクトの宣言には属性やメソッドが含まれることができますが、構造関数(これは理にかなっています)は許可されていません。

通常のクラスのオブジェクトと同様に、.シンボルを使用してメソッドを呼び出し、属性にアクセスできます。

例:オブジェクトの宣言

object Test {
    private var a: Int = 0
    var b: Int = 1
    fun makeMe12(): Int {
        a = 12
        return a
    }
}
fun main(args: Array<String>) {
    val result: Int
    result = Test.makeMe12()
    println("b = ${Test.b}")
    println("result = $result")
}

このプログラムを実行したとき、出力は以下の通りです:

b = 1
result = 12

オブジェクトの宣言は、クラスやインターフェースから像普通のクラスのように継承できます。

シングルトンおよび依存注入

オブジェクトの宣言は時には便利ですが、大規模なソフトウェアシステムの多くの他の部分と相互作用する場合には理想的ではありません。

Kotlin オブジェクト式

objectキーワードは、匿名クラスのオブジェクトを作成するために使用されます。あるクラスやインターフェースを少し変更するだけのオブジェクトを作成する必要がある場合、子クラスを宣言する必要がありません。例えば、

window.addMouseListener(object : MouseAdapter() {
    override fun mouseClicked(e: MouseEvent) {
        // ...
    }
    override fun mouseEntered(e: MouseEvent) {
        // ...
    }
}

ここでは、MouseAdapterクラスを拡張する匿名オブジェクトが宣言されています。このプログラムはMouseAdapterメソッドのmouseClicked()とmouseEntered()をオーバーライドしています。

必要に応じて、匿名オブジェクトに名前を付け、変数に格納することができます。例えば:

val obj = object : MouseAdapter() {
    override fun mouseClicked(e: MouseEvent) {
        // ...
    }
    override fun mouseEntered(e: MouseEvent) {
        // ...
    }
}

例:Kotlin オブジェクト式

open class Person() {
    fun eat() = println("食べる。")
    fun talk() = println("人と話す。")
    open fun pray() = println("神に祈る。")}}
}
fun main(args: Array<String>) {
    val atheist = object : Person() {
        override fun pray() = println("私は祈る。私は無神論者です。")
    }
    atheist.eat()
    atheist.talk()
    atheist.pray()
}

このプログラムを実行したとき、出力は以下の通りです:

食べる。
人と話す。
私は祈る。私は無神論者です。

ここでは、匿名オブジェクトが変数atheistに格納されており、Personクラスを実装し、pray()メソッドがオーバーライドされています。

実装したクラスが宣言された匿名オブジェクトのコンストラクタを持っている場合、適切なコンストラクタパラメータを渡す必要があります。例えば、

open class Person(name: String, age: Int) {
    init {
        println("name: $name, age: $age")
    }
    fun eat() = println("食べる。")
    fun talk() = println("人と話す。")
    open fun pray() = println("神に祈る。")}}
}
fun main(args: Array<String>) {
    val atheist = object : Person("Jack", 29) {
        override fun pray() = println("私は祈る。私は無神論者です。")
    }
    atheist.eat()
    atheist.talk()
    atheist.pray()
}

このプログラムを実行したとき、出力は以下の通りです:

name: Jack, age: 29
食べる。
人と話す。
私は祈る。私は無神論者です。