Как вызвать методы в конструкторе перечисления Java Singleton? - PullRequest
0 голосов
/ 15 ноября 2018

Мой пример перечисления Singleton класс:

public class Test{

    public enum MyClass{

        INSTANCE;

        private static String name = "Hello";

        MyClass() {
            test();
        }

        private static void test(){
            name = name + "World";
            System.out.println(name);
        }
    }

    public static void main(String a[]){

        MyClass m1 = MyClass.INSTANCE; 

    }
}

Полученный вывод: nullWorld
Ожидаемый вывод: HelloWorld

В main (), если

MyClass m1 = MyClass.INSTANCE;

заменяется на

MyClass.INSTANCE.test();

, а затем выводится HelloWorld, как и ожидалось.

Это показывает, что статические поля не инициализируются, пока конструктор не завершит выполнение.

Вопрос: Как добиться этой функциональности вызова метода внутри конструктора, который обращается к статическим полям?

1 Ответ

0 голосов
/ 15 ноября 2018

Это потому, что INSTANCE объявлено до name, поэтому оно создается и инициализируется до инициализации name.

Это работает:

public enum MyClass{
    INSTANCE;
    private static final String name = "Hello";

    MyClass() {
        test();
    }

    private static void test(){
        String name1 = name + "World";
        System.out.println(name1);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...