如何在Java Singleton枚举构造函数中调用方法?

Aad*_*i R 5 java singleton enums constructor

我的示例枚举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; 

    }
}
Run Code Online (Sandbox Code Playgroud)

获得的输出:nullWorld
预期输出:HelloWorld

在main()中,if

MyClass m1 = MyClass.INSTANCE;
Run Code Online (Sandbox Code Playgroud)

被替换为

MyClass.INSTANCE.test();
Run Code Online (Sandbox Code Playgroud)

然后,输出是HelloWorld,正如预期的那样.

这表明在构造函数完成执行之前,不会初始化静态字段.

问题:如何实现在访问静态字段的构造函数中调用方法的这种功能?

Evg*_*eev 3

这是因为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);
    }
Run Code Online (Sandbox Code Playgroud)

  • @Kartik使其成为“最终”会改变事情,因为该变量现在是一个[_编译时常量_](/sf/ask/635808001/?rq=1)。这意味着编译器将“test()”中“name”的使用替换为“name”常量值。由于这种情况发生在编译时,因此初始化顺序没有问题。 (4认同)