2011-02-03 86 views

回答

7

而一个单由 静态方法

实例虽然这是做它的通常的方式,这绝不是唯一的方法。

在Java 1.5辛格尔顿的新版本是枚举单件模式:

public enum Elvis{ 

INSTANCE // this is a singleton, no static methods involved 

} 

而且,由于枚举可以有构造函数,方法和字段,你可以给他们所有你想要不可改变状态。

参考:


此外,术语辛格尔顿留下一些空间对于i释义(1)。单身意味着每定义范围只有一个对象,但范围可以是一些事情:

  • Java虚拟机类加载(感谢@保罗Ebermann提醒我):在这种情况下使用enumsinitialize-through-static-inner-class pattern。这当然是单身通常意味着的。
    小心:如果通过多个类加载器加载,枚举和所有其他单例都会被破坏。
  • 企业应用(在这种情况下,你需要一个容器管理的单身人士,例如Spring singleton bean)。这可能是每个虚拟机的多个对象或每几个虚拟机一个对象(或每个VM一个对象,当然)
  • 主题(使用ThreadLocal
  • 请求/会议(再次,你会需要一个容器来管理这个,SpringSeam和其他几个人能为你做的)
  • 我忘记什么?

上述所有可以由一成不变的,每个以自己的方式(尽管它通常不是容易的容器管理的组件)

+1

节拍由12秒= [ – KitsuneYMG 2011-02-03 14:45:49

+0

这个例子是从有效的Java拍摄,我相信;-) – darioo 2011-02-03 14:59:26

1
public enum MySingleton { 
instance; 
//methods 
} 

//usage 
MySingleton.instance.someMethod(); 
5

该解决方案由肖恩指出的是一个很好的方式初始化单身人士如果他们的创作并不昂贵。如果您想要“延迟加载”功能,请查看需求持有人惯用语的初始化。

// from wikipedia entry 
public class Singleton { 

    // Private constructor prevents instantiation from other classes 
    private Singleton() { 
    } 

    /** 
    * SingletonHolder is loaded on the first execution of Singleton.getInstance() 
    * or the first access to SingletonHolder.INSTANCE, not before. 
    */ 
    private static class SingletonHolder { 
    public static final Singleton INSTANCE = new Singleton(); 
    } 

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

} 
1

你不需要复杂。为了不可变,对象一旦创建就必须是不可修改的。这通常被解释为意味着“只能在构造函数中修改”,但如果要创建它,仍然会使其不可变。只要你的对象在初始化后不能被修改,那它就是不可变的。您可以考虑将Singleton实例设置为初始化的一部分。

不变性的大多数好处在单身人士中是无关紧要的。

相关问题