Основным отличием является то, что в первом случае 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
, поэтому фрагмент в верхней части моего ответа работает.