@kivinus1
учусь

Почему этот код не выдает ошибку «Val cannot be reassigned»?

Данный пример увидел в статье https://habr.com/ru/company/funcorp/blog/425943/ . Автор статьи написал, что не знает, каким образом константа (val) меняет значение, и что, вероятно, это ошибка. Может это глупый вопрос, но очень хочу разобраться что конкретно происходит с переменной при создании нового объекта, как val testParam принимает различные значения.

Программа выводит:
"in showTestParam testParam = some string"
"in constructor testParam = after"

class MyClassB {

    init {
        testParam = "some string"
        showTestParam()
    }

    init {
        testParam = "new string"
    }

    val testParam: String = "after"

    constructor(){
        println("in constructor testParam = $testParam")
    }

    fun showTestParam(){
        println("in showTestParam testParam = $testParam")
    }
}

fun main() {
    val classB = MyClassB()}
  • Вопрос задан
  • 66 просмотров
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy Куратор тега Kotlin
Android developer at Yandex
Никогда сильно об этом не задумывался. Судя по всему, частично скопировали поведение из джавы, а частично просто ошиблись в дизайне языка на ранней стадии проектирования. И теперь должны это поддерживать. Причин так делать не вижу, control flow analysis позволяет избежать переприсваивания. Кстати, если вызовешь showTestParam() в самом начале первого init-блока, там ещё и null будет:(
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы