0Pricing
Kotlin Academy · レッスン

ネストしたクラス

クラスの中にクラスを定義します

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

クラスの中のクラス

Kotlinでは、あるクラスの中に別のクラスを宣言できます。デフォルトでは、そのようなクラスはネストクラスであり、外側のインスタンスへの参照を保持しません。

class Outer {
    class Nested {
        fun hello() = "Hi from Nested"
    }
}

fun main() {
    println(Outer.Nested().hello())
}

ネストクラスのインスタンスを作成する

ネストクラスは独立しているため、外側のインスタンスなしで外側のクラス名を通して作成します。Outer.Nested()のように記述します。

class Computer {
    class Cpu {
        val cores = 8
    }
}

fun main() {
    val cpu = Computer.Cpu()
    println(cpu.cores)
}

外側のメンバーにはアクセスできない

ネストクラスには外側のクラスへの参照がないため、外側のクラスのインスタンスメンバーを参照できません。名前空間の下にスコープされたトップレベルクラスのように動作します。

class Bank {
    val name = "ACME"
    class Branch {
        fun describe() = "A branch"
    }
}

fun main() {
    println(Bank.Branch().describe())
}

ネストする理由

ネストは論理的なグループ化を表します。内部の型が外側の型に概念的に属することを示し、整理しやすく、名前空間も明確になります。

class Http {
    class Request(val url: String)
}

fun main() {
    val r = Http.Request("/home")
    println(r.url)
}

プロパティを持つネストしたクラス

ネストしたクラスは通常のクラスです。コンストラクター、プロパティ、メソッドを持てます。

class Garage {
    class Car(val model: String) {
        fun honk() = "$model: beep"
    }
}

fun main() {
    println(Garage.Car("Tesla").honk())
}

コンパニオンまたは static のようなメンバーへのアクセス

ネストしたクラスは、Java の static ネストクラスと同様に、外側の名前を使ってどこからでも参照できます。

class Config {
    class Defaults {
        val timeout = 30
    }
}

fun main() {
    println(Config.Defaults().timeout)
}

複数のネストしたクラス

外側のクラスには、関連する型をまとめるために複数のネストしたクラスを含めることができます。

class Shapes {
    class Circle(val r: Int)
    class Square(val side: Int)
}

fun main() {
    println(Shapes.Circle(5).r)
    println(Shapes.Square(4).side)
}

ネストの中にネスト

複数の階層にわたってネストできますが、深いネストは可読性を損なうことがあります。

class A {
    class B {
        class C {
            val value = 42
        }
    }
}

fun main() {
    println(A.B.C().value)
}

ネストしたクラスとトップレベルクラス

機能的には、ネストしたクラスはトップレベルクラスと同じです。違いは完全修飾名だけです。関係性を明確にできる場合にネストを選択してください。

class Order {
    class Item(val price: Int)
}

fun main() {
    val total = Order.Item(10).price + Order.Item(5).price
    println(total)
}

実用的なグループ化

ビルダーの結果型を所有者の下にまとめると、自然な構造になります。

class Parser {
    class Result(val ok: Boolean, val message: String)

    fun parse(text: String) = Result(text.isNotEmpty(), "parsed")
}

fun main() {
    val res = Parser().parse("data")
    println("${res.ok} ${res.message}")
}

覚えておくべき重要なルール

クラスに外側への参照を持たせるキーワードは inner です。これがない場合、ネストしたクラスは static のように独立します。

class Box {
    class Lid
}

fun main() {
    println(Box.Lid() != null)
}

理解度チェック

ネストしたクラスについての理解度を確認してください。

おさらい

ネストしたクラスについて学びました。

  • 別のクラスの内部で宣言し、デフォルトは class(ネストしたクラス)です。
  • 外側のインスタンスへの参照を持たないため、外側のメンバーにはアクセスできません。
  • 外側の名前を使って Outer.Nested() のように作成します。
  • 論理的なグループ化や名前空間に適しています。
class Outer {
    class Nested { val x = 1 }
}

fun main() {
    println(Outer.Nested().x)
}

よくある質問

「ネストしたクラス」レッスンは無料ですか?

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

「ネストしたクラス」で何を学びますか?

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

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

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

「ネストしたクラス」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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