Kotlin позволяет определять класс данных в функции, почему? - PullRequest
1 голос
/ 11 июня 2019

В kotlin это допустимо:


fun f1(): Int {
    data class Data(val i: Int)

    val d = Data(0)

    return d.i
}

Интересно, каковы последствия объявления класса данных в функции.Мое лучшее предположение - то, что класс данных ограничен функцией, но я не нахожу ничего в документе, упоминающем об этом.

1 Ответ

3 голосов
/ 11 июня 2019

Это называется Локальные классы . Они упоминаются в документации , но только потому, что они не могут иметь модификаторы видимости.

  • Вы не можете получить доступ к локальному классу нигде, кроме функции, в которой он был объявлен.
  • Он может получить доступ к любым членам, в том числе закрытым, класса, в котором они содержатся.
  • Он может обращаться к любым локальным переменным или параметрам метода, которые входят в область объявления функции

Вы можете взглянуть на локальные классы Java для получения дополнительной информации. Это должно быть в основном то же самое.

Типичный вариант использования - реализация одноразового интерфейса.

fun main() {
    val f1 = f1()

    println(f1.x)
    println(f1.y)
}

interface Data {
    val x : Int
    val y : Int
}

fun f1(): Data {
    data class SpecificData(override val x: Int, override val y: Int) : Data

    return SpecificData(5, 10)
}
...