0Pricing
Kotlin Academy · レッスン

匿名オブジェクト

インライン実装を作成します

「匿名オブジェクト」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

インライン実装

匿名オブジェクトは、新しいクラスに名前を付けずに、クラスまたはインターフェースのインスタンスを作成します。object 式を使用します。

interface Greeter { fun greet(): String }

fun main() {
    val g = object : Greeter {
        override fun greet() = "Hi"
    }
    println(g.greet())
}

インターフェースの実装

object 式を使うと、必要な場所で1つ以上のインターフェースを実装できます。

interface Clickable { fun click() }

fun main() {
    val button = object : Clickable {
        override fun click() = println("Clicked")
    }
    button.click()
}

クラスメンバーのオーバーライド

open クラスを匿名でサブクラス化し、メンバーをオーバーライドできます。

open class Animal { open fun sound() = "..." }

fun main() {
    val cat = object : Animal() {
        override fun sound() = "Meow"
    }
    println(cat.sound())
}

追加の状態の保持

匿名オブジェクトでは、オーバーライドするメンバー以外に独自のプロパティを宣言することもできます。

fun main() {
    val point = object {
        val x = 3
        val y = 4
    }
    println("${point.x}, ${point.y}")
}

スーパータイプのないオブジェクト

スーパータイプを省略すると、オブジェクトはメンバーをまとめただけのアドホックな構造になり、簡単なローカルグループ化に便利です。

fun main() {
    val config = object {
        val retries = 3
        val timeout = 30
    }
    println(config.retries)
}

ローカル変数のキャプチャ

匿名オブジェクトは、static ネストクラスとは異なり、外側のスコープにある変数をキャプチャできます。

fun makeCounter(start: Int): () -> Int {
    var count = start
    val obj = object {
        fun next() = count++
    }
    return { obj.next() }
}

fun main() {
    val c = makeCounter(10)
    println(c())
    println(c())
}

リスナーとしての利用

よくある用途は、インライン実装をコールバックまたはリスナーとして渡すことです。

interface OnDone { fun done(result: Int) }

fun compute(cb: OnDone) {
    cb.done(42)
}

fun main() {
    compute(object : OnDone {
        override fun done(result: Int) = println("Got $result")
    })
}

匿名オブジェクトの型

関数から返す場合、推論される型は宣言されたスーパータイプになります(なければ Any です)。追加のメンバーが見えるのはローカルだけです。

interface Named { val name: String }

fun make(): Named = object : Named {
    override val name = "X"
}

fun main() {
    println(make().name)
}

匿名オブジェクトとラムダ

単一メソッドのインターフェースではラムダのほうが短く書けますが、複数のメンバーをオーバーライドしたり状態を保持したりする必要がある場合は匿名オブジェクトを使います。

interface Handler {
    fun onStart()
    fun onStop()
}

fun main() {
    val h = object : Handler {
        override fun onStart() = println("start")
        override fun onStop() = println("stop")
    }
    h.onStart()
    h.onStop()
}

object 式と object 宣言

式としての object は、使うたびに新しいインスタンスを作成します。宣言としての object Name {} は、名前付きのシングルトンです。見た目は似ていますが、寿命が異なります。

object Singleton { val id = 1 }

fun main() {
    val fresh = object { val id = 2 }
    println(Singleton.id)
    println(fresh.id)
}

簡潔なコンパレーター

匿名オブジェクトは、一度しか使わないコンパレーターやストラテジーに便利です。

fun main() {
    val cmp = object : Comparator<Int> {
        override fun compare(a: Int, b: Int) = b - a
    }
    val list = listOf(1, 3, 2).sortedWith(cmp)
    println(list)
}

理解度チェック

匿名オブジェクトについての理解度を確認してください。

おさらい

匿名オブジェクトについて学びました。

  • object : Type {} 式で名前のないインスタンスを作成します。
  • インターフェースを実装したり、open クラスをサブクラス化したり、状態を保持したりできます。
  • 外側のスコープにあるローカル変数をキャプチャします。
  • 複数メソッドのコールバックには匿名オブジェクトを使い、単一メソッドにはラムダを優先します。
interface Run { fun go() }

fun main() {
    val r = object : Run { override fun go() = println("go") }
    r.go()
}

よくある質問

「匿名オブジェクト」レッスンは無料ですか?

はい。「匿名オブジェクト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「匿名オブジェクト」で何を学びますか?

インライン実装を作成します ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「匿名オブジェクト」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ネストしたクラス
  2. 内部クラス
  3. 匿名オブジェクト
  4. ローカルクラス
← Kotlin Academyに戻る