匿名オブジェクトとオブジェクト式
オブジェクト式を使って、インターフェースの一度限りの実装を作成します。
「匿名オブジェクトとオブジェクト式」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
オブジェクト式
オブジェクト式は、クラスまたはインターフェースの匿名の一度限りのインスタンスを作成します。Javaの匿名内部クラスに相当しますが、より強力です。
匿名でのインターフェース実装
object : Interface { ... }を使用すると、インラインで実装を作成できます。
interface ClickListener {
fun onClick(): String
}
fun main() {
val listener = object : ClickListener {
override fun onClick() = "clicked!"
}
println(listener.onClick())
}状態を持つ匿名クラス
匿名オブジェクトは状態を保持でき、複数のメソッドを持つこともできます。
fun main() {
val counter = object {
var count = 0
fun inc() { count++ }
fun show() = println("count = $count")
}
counter.inc(); counter.inc(); counter.inc()
counter.show()
}匿名オブジェクトの型
匿名オブジェクトの型は推論されます。関数レベルで宣言した場合は、独自に追加したメンバーにもアクセスできます。
fun main() {
val pair = object {
val left = "L"
val right = "R"
}
println("${pair.left} and ${pair.right}")
}匿名型の公開範囲
匿名オブジェクトを推論された型で関数から返すと、呼び出し側から見えるのはスーパータイプだけです。匿名オブジェクトに追加したメンバーには外部からアクセスできません。
fun makeListener() = object {
fun greet() = "hello"
}
fun main() {
val l = makeListener()
println(l.greet()) // OK — same compilation unit
}複数のインターフェース
匿名オブジェクトは、1つの式で複数のインターフェースを実装できます。
interface Closeable { fun close() }
interface Flushable { fun flush() }
fun main() {
val resource = object : Closeable, Flushable {
override fun close() = println("closed")
override fun flush() = println("flushed")
}
resource.flush()
resource.close()
}クラスの拡張
匿名オブジェクトは、openクラスを拡張してメンバーをオーバーライドできます。
open class Animal(val name: String) {
open fun speak() = "$name makes a sound"
}
fun main() {
val pet = object : Animal("Rex") {
override fun speak() = "$name barks!"
}
println(pet.speak())
}外側のスコープの変数をキャプチャする
匿名オブジェクトは、外側のスコープにある変数を参照して変更できます。Javaのようにfinalである必要はありません。
fun main() {
var log = mutableListOf<String>()
val recorder = object {
fun record(s: String) { log.add(s) }
}
recorder.record("event 1")
recorder.record("event 2")
println(log)
}匿名オブジェクトを使用する場面
独自のクラスを作るほどではない一度限りの実装に匿名オブジェクトを使用します。代表的な用途は、コールバック、リスナー、コンパレーターです。
fun main() {
val nums = listOf(3, 1, 4, 1, 5, 9, 2, 6)
val sorted = nums.sortedWith(object : Comparator<Int> {
override fun compare(a: Int, b: Int) = b - a // descending
})
println(sorted)
}可能ならラムダを優先する
インターフェースに抽象メソッドが1つだけある場合(SAM)、オブジェクト式よりもラムダのほうが簡潔です。
fun main() {
val nums = listOf(3, 1, 4, 1, 5, 9)
// Old way:
val sorted1 = nums.sortedWith(object : Comparator<Int> {
override fun compare(a: Int, b: Int) = b - a
})
// New way — SAM conversion:
val sorted2 = nums.sortedWith(Comparator { a, b -> b - a })
println("$sorted1 / $sorted2")
}匿名objectと宣言済みobject
名前付きシングルトンにはobject Nameを使用します。一度限りの匿名インスタンスには、式の中でobject : Typeを使用します。
// Named singleton (one instance, accessed globally)
object GlobalLogger { fun log(m: String) = println("[L] $m") }
// Anonymous (created at expression evaluation)
fun main() {
val local = object { fun hi() = "hi" }
GlobalLogger.log("hello")
println(local.hi())
}クイックチェック
インターフェースをインラインで実装する匿名インスタンスは、どの構文で作成しますか。
まとめ
オブジェクト式は、一度限りの匿名インスタンスをインラインで作成します。インターフェースの実装、クラスの拡張、状態の保持、外側のスコープの変数のキャプチャが可能です。単一メソッドのインターフェースにはラムダを優先し、複数のメソッドや状態が必要な場合はオブジェクト式を使用します。
よくある質問
「匿名オブジェクトとオブジェクト式」レッスンは無料ですか?
はい。「匿名オブジェクトとオブジェクト式」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- object宣言:Kotlinのシングルトン
- companion object:Kotlinで静的メンバーのように使う
- 匿名オブジェクトとオブジェクト式
- companion objectによるファクトリーメソッド