kotlin ... Массив проблем с областями видимости - PullRequest
1 голос
/ 26 мая 2019

Почему первый пример кода ниже компилируется, а второй не работает. Единственное изменение заключается в том, что я переместил значение val из области видимости файла в область видимости.

longArrayOf (...) создает LongArray, верно?

Компилируется без проблем:

val CORRECT_BUZZ_PATTERN = longArrayOf(100, 100, 100, 100, 100, 100)
class TestLongArrayOf {
    enum class BuzzType(val pattern: LongArray) {
        CORRECT(CORRECT_BUZZ_PATTERN)
    }
}


Сбой с сообщением «неразрешенная ссылка CORRECT_BUZZ_PATTERN»

class TestLongArrayOf {
    val CORRECT_BUZZ_PATTERN = longArrayOf(100, 100, 100, 100, 100, 100)
    enum class BuzzType(val pattern: LongArray) {
        CORRECT(CORRECT_BUZZ_PATTERN)
    }
}

1 Ответ

2 голосов
/ 26 мая 2019

Основным отличием является то, что в первом случае CORRECT_BUZZ_PATTERN определяется вне класса и обрабатывается как переменная только для чтения (доступная через его метод получения), тогда как во втором фрагменте это экземпляр только для чтения.переменная , поэтому ее нельзя использовать как константу.Однако этот код будет работать:

class TestLongArrayOf {
    val CORRECT_BUZZ_PATTERN = longArrayOf(100, 100, 100, 100, 100, 100)
    enum class BuzzType(val pattern: LongArray) {
        CORRECT(TestLongArrayOf().CORRECT_BUZZ_PATTERN)
    }
}

Давайте посмотрим на сгенерированный байт-код.В первом случае у вас есть:

public final class MainKt {
    private final static long[] CORRECT_BUZZ_PATTERN
    public final static long[] getCORRECT_BUZZ_PATTERN() {
        ...
    }
    static {
        // initialize CORRECT_BUZZ_PATTERN here
        ...
    }
}

public final enum TestLongArrayOf$BuzzType {
    ...
}

Итак, CORRECT_BUZZ_PATTERN - это массив static final, принадлежащий классу MainKt, к которому можно получить доступ через его геттер.

Во втором случае, что выget is:

public final class TestLongArrayOf {
    private final long[] CORRECT_BUZZ_PATTERN

    public final long[] getCORRECT_BUZZ_PATTERN() {
        ...
    }
}

public final enum TestLongArrayOf$BuzzType { 
    ...
}

Обратите внимание, что в этом случае CORRECT_BUZZ_PATTERN - это переменная экземпляра, которую можно получить через ее метод получения.Однако, поскольку это переменная экземпляра, вы должны вызывать метод получения для экземпляра TestLongArrayOf, поэтому фрагмент в верхней части моего ответа работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...