我有以下定义,您可以根据定义将其称为延迟加载的单例:

public class MySingleton {

    public static String myTrigger="a trigger";

    private MySingleton(){
    }

    private static enum LazyLoad {
        IMDB_LOOKUP_INSTANCE;
        private static final IMDB_LOOKUP = new MySingleton();
    }

    public static MySingleton getInstance() {
        return LazyLoad.IMDB_LOOKUP_INSTANCE.IMDB_LOOKUP;
    }
}


当我这样打电话时会发生什么:

String someString = MySingleton.myTrigger;


单例不会被实例化吗?

最佳答案

经过测试(通过将打印语句放入构造函数中),我发现-

在上面的代码中,直到调用MySingleton.getInstance()时,实例化才会发生。

但是,如果将静态MySingleton对象放置为类的直接属性,而不是在枚举内部,则将在对MySingleton.myTrigger的调用中实例化该对象,这是因为在加载类时会实例化所有静态字段。

但是对于enum,enum不是该类的静态属性,它仅在访问时加载。

我也测试过类似的东西-

class MySingleton {

public static String myTrigger="a trigger";

    private MySingleton(){
        System.out.println("Printing");
    }

    public static enum LazyLoad {
        IMDB_LOOKUP_INSTANCE;
        public static final String Hello = "Hello";
        private static final MySingleton IMDB_LOOKUP = new MySingleton();
    }

    public static MySingleton getInstance() {
        return LazyLoad.IMDB_LOOKUP_INSTANCE.IMDB_LOOKUP;
    }
}


在上面,对MySingleton.LazyLoad.IMDB_LOOKUP_INSTANCE.Hello的调用也将导致MySingleton对象的实例化。

09-04 03:25
查看更多