首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java Singleton设计模式:问题

Java Singleton设计模式:问题
EN

Stack Overflow用户
提问于 2010-08-07 08:10:15
回答 11查看 9.3K关注 0票数 18

我最近接受了一次采访,他问我关于单例设计模式是如何实现的,我告诉他使用静态变量和静态方法,我们可以实现单例设计模式。

他似乎对答案有点满意,但我想知道

我们可以通过多少种不同的方式在Java中实现单例设计模式?

  • 单例对象的范围是什么,它在Java虚拟机中是如何工作的?我知道我们总是有一个单例对象的实例,但是这个对象的实际作用域是什么?它是在JVM中运行的,还是如果有多个应用程序在JVM中运行而不是它的每个上下文的作用域,我真的被这个问题难住了,无法给出令人满意的解释?

  • 最后他问到,是否可以使用带有解释的集群的单例对象,当我们调用Bean工厂来获取对象时,有没有办法让Spring不实现单例设计模式?

关于Singleton的任何输入都将受到高度赞赏,在处理Singleton时需要牢记的主要事项是什么?

谢谢。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2010-08-07 08:52:22

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

代码语言:javascript
复制
// 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
}

在上面的例子中,每个类加载器都有一个实例。

关于在集群中使用单例...我不确定“使用”is...is面试官的定义是什么,这意味着在整个集群中创建单个实例?我不确定这是不是很有意义...?

最后,在spring中定义非单例对象只需通过属性singleton="false“即可完成。

票数 15
EN

Stack Overflow用户

发布于 2010-08-07 09:06:50

我不同意“声名狼藉”。

单例的作用域是它在Classloader树中的节点。它包含类加载器,并且任何子类加载器都可以看到单例。

理解这个作用域的概念很重要,特别是在具有复杂的Classloader层次结构的应用服务器中。

例如,如果您在应用程序服务器的系统类路径上的jar文件中有一个库,并且该库使用Singleton,则该Singleton将(很可能)对部署到应用程序服务器的每个“应用程序”都是相同的。这可能是一件好事,也可能不是一件好事(取决于库)。

类加载器是Java和JVM中最重要的概念之一,单例在其中发挥了作用,所以我认为Java程序员“关心”是很重要的。

票数 2
EN

Stack Overflow用户

发布于 2010-08-07 09:43:10

我发现很难相信有这么多答案错过了单例的最佳标准实践-使用枚举-这将给你一个单例,它的范围是类加载器,这对于大多数目的来说已经足够好了。

代码语言:javascript
复制
public enum Singleton { ONE_AND_ONLY_ONE ; ... members and other junk ... }

至于更高级别的单例-也许我有点傻-但我倾向于分发JVM本身(并限制类加载器)。那么枚举就足以胜任这项工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3428615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档