Интерфейс статического поля Java ленивая инициализация - PullRequest
1 голос
/ 28 марта 2019

Приведенный пример

interface A {
    static int aInit() {
        System.out.println("Interface field");
        return 42;
    }
    int a = aInit();
}

class B implements A {
    static int bInit() {
        System.out.println("Class field");
        return 42;
    }
    static final int b = bInit();
}

A a = new B();

на принтерах JDK8 и JDK10 просто "Class field". Прямой доступ к A.a порождает его инициализацию и вывод "Interface field".

Это показывает, что инициализация статического поля интерфейса является ленивой , что неверно для конечного поля статического класса.

Я вижу черновик OpenJDK JEP о такой лени для классов, но является ли это документированной функцией интерфейса? Или просто деталь реализации JVM?

1 Ответ

1 голос
/ 28 марта 2019

Это документированное поведение.Интерфейс A не будет инициализирован согласно https://docs.oracle.com/javase/specs/jls/se12/html/jls-12.html#jls-12.4.1. Он инициализируется только при вызове поля a или метода aInit().

...