Java Singleton设计模式:问题

Rac*_*hel 17 java singleton spring design-patterns

我最近接受了一次采访,他向我询问了关于它们如何实现的Singleton Design Patterns,并告诉他使用静态变量和静态方法我们可以实现Singleton Design Patterns.

他似乎对答案感到满意,但我想知道

  1. 我们可以用多少种方法在Java中实现Singleton Design Pattern?
  2. Singleton Object的范围是什么,它在JVM中的实际工作方式是什么?我知道我们总是有一个Singleton Object的实例,但是该对象的实际范围是什么,是在JVM中还是运行多个应用程序而不是它的范围是在JVM中的每个上下文基础上,我真的很难过无法给出令人满意的解释?
  3. 最后他问是否可以使用带有Clusters的Singleton Object和解释,当我们调用Bean Factory来获取对象时,有没有办法让Spring不实现Singleton Design Pattern?

关于Singleton的任何意见都会受到高度赞赏,在处理Singletons时要记住哪些主要内容?

谢谢.

Tim*_*ddy 15

有几种方法可以在Java中实现Singleton模式:

// private constructor, public static instance
// usage: Blah.INSTANCE.someMethod();
public class Blah {
    public static final Blah INSTANCE = new Blah();
    private Blah() {
    }
    // public methods
}

// private constructor, public instance method
// usage: Woo.getInstance().someMethod();
public class Woo {
    private static final Woo INSTANCE = new Woo();
    private Woo() {
    }
    public static Woo getInstance() {
        return INSTANCE;
    }
    // public methods
}

// Java5+ single element enumeration (preferred approach)
// usage: Zing.INSTANCE.someMethod();
public enum Zing {
    INSTANCE;
    // public methods
}
Run Code Online (Sandbox Code Playgroud)

鉴于上面的示例,每个类加载器将有一个实例.

关于在集群中使用单例...我不确定"使用"的定义是什么......是面试者暗示在整个集群中创建单个实例?我不确定这是否有多大意义......?

最后,在spring中定义一个非单例对象只需通过属性singleton ="false"完成.

  • 在第二个例子中,我建议将`INSTANCE`对象放在私有静态内部类中.然后`getSingleton()`方法访问内部类中的变量,并且单例在第一次需要之前不存在(即,延迟实例化) (2认同)
  • @T Reddy:内心阶级并非不必要.对于许多用途,它可能是矫枉过正,但它执行其使单例具有惰性实例化的功能.Occam的Razor与讨论完全没有任何关系.Occam的Razor用于决定多种**理论**.我们正在讨论多个**同等有效的解决方案**. (2认同)