0Pricing
Kotlin Academy · レッスン

内部クラス

外側のスコープにアクセスします

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

inner キーワード

ネストしたクラスに inner を付けると、外側のインスタンスへの参照が与えられ、外側のクラスのメンバーにアクセスできるようになります。

class Outer {
    val msg = "Hello"
    inner class Inner {
        fun show() = msg
    }
}

fun main() {
    println(Outer().Inner().show())
}

インスタンスの作成

インナークラスには外側のインスタンスが必要なため、外側のインスタンスから Outer().Inner() のように作成します。

class Engine {
    val power = 100
    inner class Turbo {
        fun boosted() = power * 2
    }
}

fun main() {
    println(Engine().Turbo().boosted())
}

外側のプロパティへのアクセス

インナークラスは、外側のプロパティを自分のプロパティであるかのように直接読み取り、使用できます。

class Counter {
    var count = 0
    inner class Stepper {
        fun step() { count++ }
    }
}

fun main() {
    val c = Counter()
    c.Stepper().step()
    println(c.count)
}

外側のメソッドの呼び出し

インナークラスは、外側のインスタンスのメソッドも呼び出せます。

class Printer {
    fun line(s: String) = println(s)
    inner class Job {
        fun run() = line("printing")
    }
}

fun main() {
    Printer().Job().run()
}

this@Outer 構文

外側のインスタンスを明示的に参照するには(たとえば名前が衝突する場合)、this@Outer を使用します。

class Outer {
    val value = 10
    inner class Inner {
        val value = 20
        fun outerValue() = this@Outer.value
    }
}

fun main() {
    println(Outer().Inner().outerValue())
}

inner を使う理由

ネストした型が特定の外側のインスタンスと実際に連携し、その状態を共有する必要がある場合に inner を使用してください。

class Wallet {
    var balance = 50
    inner class Transaction(val amount: Int) {
        fun apply() { balance += amount }
    }
}

fun main() {
    val w = Wallet()
    w.Transaction(25).apply()
    println(w.balance)
}

各インスタンスは1つの外側に結び付く

インナークラスのインスタンスは、それを作成した特定の外側のインスタンスに結び付いており、変更はそのオブジェクトに反映されます。

class Box(var size: Int) {
    inner class Resizer {
        fun grow() { size += 1 }
    }
}

fun main() {
    val b = Box(3)
    b.Resizer().grow()
    println(b.size)
}

インナークラスとネストしたクラス

inner がなければ、ネストしたクラスは独立しています。inner があれば、外側のインスタンスをキャプチャします。このキーワードが違いのすべてです。

class Outer {
    val tag = "X"
    inner class A { fun get() = tag }
}

fun main() {
    println(Outer().A().get())
}

メモリに関する注意

インナークラスのインスタンスは外側のインスタンスを保持し続けるため、外側のオブジェクトを意図せず保持し続けないよう、長期間存続するインナークラスのオブジェクトには注意してください。

class Service {
    val id = 1
    inner class Worker { fun who() = id }
}

fun main() {
    println(Service().Worker().who())
}

実践的なイテレーター

インナークラスは、外側のコレクションの状態を走査するイテレーターに適しています。

class Stack {
    private val items = mutableListOf(1, 2, 3)
    inner class Reader {
        fun all() = items.joinToString()
    }
}

fun main() {
    println(Stack().Reader().all())
}

概念の組み合わせ

インナークラスでは外側の状態を使用でき、this@Outer で参照先を明確にできます。

class Outer {
    val n = 5
    inner class Inner {
        fun doubled() = this@Outer.n * 2
    }
}

fun main() {
    println(Outer().Inner().doubled())
}

理解度チェック

インナークラスについての理解度を確認してください。

おさらい

インナークラスについて学びました。

  • inner によって、外側のインスタンスとそのメンバーにアクセスできます。
  • 外側のインスタンスから Outer().Inner() のように作成します。
  • 外側のインスタンスを参照するには this@Outer を使用します。
  • インナークラスのインスタンスは外側のインスタンスを保持し続けます。
class Outer {
    val v = 1
    inner class Inner { fun get() = v }
}

fun main() {
    println(Outer().Inner().get())
}

よくある質問

「内部クラス」レッスンは無料ですか?

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

「内部クラス」で何を学びますか?

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

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

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

「内部クラス」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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