为什么下面的第一个代码示例会编译,而第二个示例则会失败。唯一的变化是我将涉及的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)
}
}
答案 0 :(得分:2)
主要区别在于,在第一种情况下,CORRECT_BUZZ_PATTERN
是在类外部定义的,并且被视为只读变量(可通过其getter访问),而在第二个片段中,它是只读的 instance variable ,因此它不能用作常量。
但是,此代码将起作用:
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
数组,可以通过其getter进行访问。
在第二种情况下,您得到的是:
public final class TestLongArrayOf {
private final long[] CORRECT_BUZZ_PATTERN
public final long[] getCORRECT_BUZZ_PATTERN() {
...
}
}
public final enum TestLongArrayOf$BuzzType {
...
}
请注意,在这种情况下,CORRECT_BUZZ_PATTERN
是一个实例变量,可以通过其getter进行检索。但是,由于它是一个实例变量,因此必须在TestLongArrayOf
的实例上调用getter,这就是为什么我的答案顶部的代码段有效的原因。