kotlin ... ArrayOf范围问题

时间:2019-05-26 17:52:23

标签: kotlin scoping

为什么下面的第一个代码示例会编译,而第二个示例则会失败。唯一的变化是我将涉及的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 个答案:

答案 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,这就是为什么我的答案顶部的代码段有效的原因。