0Pricing
Kotlin Academy · レッスン

ローカルクラス

関数内にクラスを定義します

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

関数内のクラス

Kotlin では、関数本体の内部にローカルクラスを宣言できます。このクラスはその関数内でのみ使用できます。

fun main() {
    class Greeting(val text: String) {
        fun show() = println(text)
    }
    Greeting("Hello local").show()
}

関数内に限定されるクラス

ローカルクラスは、宣言された関数の外部では使用できないため、ヘルパー型をその関数内に厳密に閉じ込められます。

fun build(): String {
    class Builder {
        fun make() = "built"
    }
    return Builder().make()
}

fun main() {
    println(build())
}

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

クロージャと同様に、ローカルクラスは外側の関数にある変数をキャプチャできます。

fun main() {
    val prefix = ">> "
    class Logger {
        fun log(msg: String) = println(prefix + msg)
    }
    Logger().log("started")
}

複数のインスタンス

関数内では、ローカルクラスのインスタンスを必要な数だけ作成できます。

fun main() {
    class Point(val x: Int)
    val a = Point(1)
    val b = Point(2)
    println(a.x + b.x)
}

メソッドを持つローカルクラス

ローカルクラスは完全なクラスなので、コンストラクター、プロパティ、メソッドをすべて使用できます。

fun main() {
    class Account(var balance: Int) {
        fun deposit(n: Int) { balance += n }
    }
    val acc = Account(100)
    acc.deposit(50)
    println(acc.balance)
}

ローカルクラスを使う理由

ヘルパー型が1つの関数内でのみ意味を持つ場合に使用すると、ファイルをトップレベルの型で不必要に複雑にせずに済みます。

fun parseLine(line: String): Int {
    class Token(val value: String)
    val tokens = line.split(",").map { Token(it) }
    return tokens.size
}

fun main() {
    println(parseLine("a,b,c"))
}

可変状態のキャプチャ

ローカルクラスは、外側のスコープからキャプチャした可変変数を変更できます。

fun main() {
    var total = 0
    class Adder {
        fun add(n: Int) { total += n }
    }
    val a = Adder()
    a.add(5)
    a.add(7)
    println(total)
}

ローカルでのインターフェース実装

ローカルクラスはインターフェースを実装できます。1つの関数内で名前付きの再利用可能な実装が必要な場合に便利です。

interface Step { fun run(): String }

fun main() {
    class First : Step {
        override fun run() = "first"
    }
    println(First().run())
}

ローカルクラスと匿名オブジェクト

複数のインスタンスを作成したり型を参照したりするために名前が必要ならローカルクラスを選びます。1つのインラインインスタンスだけでよい場合は匿名オブジェクトを選びます。

fun main() {
    class Repeater(val times: Int) {
        fun run() = "x".repeat(times)
    }
    println(Repeater(3).run())
}

ループ内のネスト

ローカルクラスはループのようなブロックの内部にも宣言でき、そのブロック内にスコープを限定できます。

fun main() {
    for (i in 1..2) {
        class Tag(val id: Int)
        println(Tag(i).id)
    }
}

実用的なヘルパー

ローカルクラスは、1つの関数だけが使用する短期間のドメインヘルパーに適しています。

fun report(values: List<Int>): String {
    class Stats(val sum: Int, val max: Int)
    val s = Stats(values.sum(), values.max())
    return "sum=${s.sum} max=${s.max}"
}

fun main() {
    println(report(listOf(3, 7, 2)))
}

理解度チェック

ローカルクラスについての理解度を確認してください。

おさらい

ローカルクラスについて学びました。

  • 関数内で宣言し、その関数内にスコープを限定します。
  • 外側のローカル変数をキャプチャし、変更することもできます。
  • コンストラクター、プロパティ、メソッド、インターフェースを備えた完全なクラスです。
  • 名前が必要ならローカルクラスを、1つのインラインインスタンスだけなら匿名オブジェクトを使用します。
fun main() {
    val tag = "L"
    class C { fun show() = tag }
    println(C().show())
}

よくある質問

「ローカルクラス」レッスンは無料ですか?

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

「ローカルクラス」で何を学びますか?

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

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

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

「ローカルクラス」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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