Kotlinのオブジェクト

1前書き

Kotlinは他の言語から多くのアイデアを借りました。そのような構成要素の1つが object. です。

この簡単な記事では、オブジェクトとは何か、そしてどのように使用できるかについて説明します。

2 Kotlinのオブジェクト

Kotlinでは、ほとんどすべてのJVM言語と同様に、オブジェクト指向プログラミングモデルの中核として class という概念があります。 Kotlinはその上に オブジェクト の概念を導入します。

class は、必要に応じてインスタンス化できる構造体を記述し、必要な数のインスタンスを可能にしますが、 object __は代わりに単一の静的インスタンスを表します

これは、シングルトンオブジェクトやカプセル化のための機能の単純なパッケージ化など、さまざまな技術に役立ちます。

object SimpleSingleton {
    val answer = 42;
    fun greet(name: String) = "Hello, $name!"
}

assertEquals(42, SimpleSingleton.answer)
assertEquals("Hello, world!", SimpleSingleton.greet("world"))
  • オブジェクトはまた、可視性修飾子** を完全にサポートし、他のクラスと同様にデータの隠蔽とカプセル化を可能にします。

object Counter {
    private var count: Int = 0

    fun currentCount() = count

    fun increment() {
        ++count
    }
}
Counter.increment()
println(Counter.currentCount())
println(Counter.count)//this will fail to compile

さらに、 オブジェクトはクラスを拡張し、インターフェイスを実装することができます 。そうすることで、まさしく予想通り、それらは事実上親クラスのシングルトンインスタンスです。

これはステートレスな実装があり、毎回新しいインスタンスを作成する必要がない場合に非常に役立ちます。 コンパレータ:

object ReverseStringComparator : Comparator<String> {
    override fun compare(o1: String, o2: String) = o1.reversed().compareTo(o2.reversed())
}

val strings = listOf("Hello", "World")
val sortedStrings = strings.sortedWith(ReverseStringComparator)

3コンパニオンオブジェクトとは何ですか?

  • コンパニオンオブジェクトは基本的に標準のオブジェクト定義と同じですが、開発を容易にするための追加機能がいくつかあります。

コンパニオンオブジェクトは、常に別のクラス内で宣言されています。 名前を付けることはできますが、名前を付ける必要はありません その場合、自動的に Companion という名前が付けられます。

class OuterClass {
    companion object {//Equivalent to "companion object Companion"
    }
}
  • コンパニオンオブジェクトを使用すると、名前を指定せずに、そのメンバーにコンパニオンクラス内からアクセスできます。

同時に、クラス名を前に付けると、可視のメンバーにクラスの外からアクセスできます。

class OuterClass {
    companion object {
        private val secret = "You can't see me"
        val public = "You can see me"
    }

    fun getSecretValue() = secret
}

assertEquals("You can see me", OuterClass.public)
assertEquals("You can't see me", OuterClass.secret)//Cannot access 'secret'

4静的フィールド

  • コンパニオンオブジェクトの主な用途は、Javaから知られている静的フィールド/メソッドを置き換えることです。ただし、これらのフィールドは、結果のクラスファイルに自動的に生成されるわけではありません。

生成する必要がある場合は、代わりにフィールドに @ JvmStatic アノテーションを使用する必要があります。これにより、期待どおりにバイトコードが生成されます。

class StaticClass {
    companion object {
        @JvmStatic
        val staticField = 42
    }
}

これを行わないと、静的フィールド staticField にJavaコードから簡単にアクセスすることはできません。

このアノテーションを追加すると、標準の静的フィールドに必要とされるとおりにフィールドが生成され、必要に応じてJavaとの完全な相互運用性が可能になります。

つまり、上記は StaticClass クラスに static メソッド getStaticField() を生成します。

5結論

Kotlinのオブジェクトは私たちが使うことができる全体の余分な層を追加します。

コンパニオンオブジェクトはこれをさらに受け継ぎ、より保守しやすく作業しやすいコードをよりきれいにします。

いつものように、コードスニペットはhttps://github.com/eugenp/tutorials/tree/master/core-kotlin[over on GitHub]にあります。