枚举和单身 - 顶级vs嵌套枚举

时间:2012-10-14 14:17:56

标签: java enums singleton

现在众所周知,在java中创建单例的推荐方法是通过枚举(参见例如here

但是(例如在这个answer中)似乎(在评论中回答我的@MikeAdler)正确考虑了 中的枚举 单例类(有关完整示例,请参阅例如here,或下面给出的代码)。我似乎并不真正了解这需要/使用 - 有人可以详细说明(并且最好为这个成语提供正确的方言)吗?

public class Enclosing {

    private  Enclosing() {}

    static enum Singleton {
        INSTANCE;

        private static final Enclosing  singleton = new Enclosing();

        public Enclosing getSingleton() {
            return singleton;
        }
    }
}

编辑:一个人可以通过Enclosing.Singleton.INSTANCE.getSingleton();

获得单身人士

2 个答案:

答案 0 :(得分:2)

当您想要执行lazy-loading时,您会嵌套一个Singleton,例如出于测试原因:

public class Singleton {
    public Enclosing getInstance() {
        return SingletonHolder.INSTANCE;
    }

    static enum SingletonHolder {
        INSTANCE;
    }
}

在此处详细了解:http://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom

答案 1 :(得分:1)

public enum Foo {
   INSTANCE;
}

是获得单例后java-5的最简单和最好的方法。你发布的代码只是不必要的复杂,我没有看到它只使用枚举的任何优势。