1. 序章

Kotlinは他の言語から多くのアイデアを借りました。 そのような構成の1つは、オブジェクトです。

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

2. Kotlinのオブジェクト

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

クラスは、必要に応じてインスタンス化でき、必要な数のインスタンスを許可できる構造を記述しますが、オブジェクトは、代わりに単一の静的インスタンスを表し、それ以上またはこの1つのインスタンスよりも少ない。

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

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. コンパニオンオブジェクトとは何ですか?

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

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

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のオブジェクトは、使用できるレイヤー全体を追加し、コードをさらに合理化し、開発を容易にします。

コンパニオンオブジェクトはこれをさらに進め、保守と操作がより簡単なよりクリーンなコードを可能にします。

いつものように、コードスニペットはGitHubにあります。