一个不可变对象仅由其构造函数初始化,而一个单例则由静态方法实例化。如何在Java中创建一个不可变的单例?如何在Java中创建一个不可变的单例?
4
A
回答
7
而一个单由 静态方法
实例虽然这是做它的通常的方式,这绝不是唯一的方法。
在Java 1.5辛格尔顿的新版本是枚举单件模式:
public enum Elvis{
INSTANCE // this is a singleton, no static methods involved
}
而且,由于枚举可以有构造函数,方法和字段,你可以给他们所有你想要不可改变状态。
参考:
此外,术语辛格尔顿留下一些空间对于i释义(1)。单身意味着每定义范围只有一个对象,但范围可以是一些事情:
Java虚拟机类加载(感谢@保罗Ebermann提醒我):在这种情况下使用enums或initialize-through-static-inner-class pattern。这当然是单身通常意味着的。
小心:如果通过多个类加载器加载,枚举和所有其他单例都会被破坏。- 企业应用(在这种情况下,你需要一个容器管理的单身人士,例如Spring singleton bean)。这可能是每个虚拟机的多个对象或每几个虚拟机一个对象(或每个VM一个对象,当然)
- 主题(使用
ThreadLocal
) - 请求/会议(再次,你会需要一个容器来管理这个,Spring,Seam和其他几个人能为你做的)
- 我忘记什么?
上述所有可以由一成不变的,每个以自己的方式(尽管它通常不是容易的容器管理的组件)
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实例设置为初始化的一部分。
不变性的大多数好处在单身人士中是无关紧要的。
相关问题
- 1. 如何在Tensorflow中创建一个不可训练的变量?
- 2. 如何在C++中创建一个简单的单例类?
- 3. 如何在Kotlin中创建一个也是Java中不可变列表的不可变列表?
- 4. 如何在Unity中创建一个通用的单例类?
- 5. 如何在matplotlib中创建一个可拖动的图例?
- 6. 如何在java中创建一个gui?
- 7. 如何在java中创建一个简单的状态机
- 8. 如何在java中创建一个简单的加密算法?
- 9. 如何在java中创建一个“可覆盖”的配置?
- 10. 如何在JLabel周围创建一个不可见边框? (JAVA)
- 11. 如何在C中创建一个单例?
- 12. 你如何在球拍中创建一个简单的变量?
- 13. 可能在C++中创建一个单例结构?怎么样?
- 14. 我如何在C中创建一个不可见但可单击的按钮?
- 15. 如何在Java中创建一个类型变量数组?
- 16. 可以在Java中创建一个循环变量吗?
- 17. 如何在另一个类中创建一个类的实例
- 18. 如何在PHP中创建单例?
- 19. 在Objective C中创建单例类的另一个实例
- 20. 如何用XCode4中的#define创建一个单例?
- 21. 什么是可变类。我们如何在C#中创建一个可变且不可变的类
- 22. 如何在Flex的不同模块中创建不同的单例,以创建相同的单例?
- 23. 如何在Java中创建一个函数“可超时”?
- 24. 如何在svn中创建一个不变的目录?
- 25. 无法在Java中创建一个类的多个实例
- 26. 在SQLAlchemy中创建一个“不可变”的列
- 27. 如何创建一个变量,如果不存在于PHP中?
- 28. 如何找到创建Java单例实例的位置?
- 29. 我该如何在C#中创建一个继承的不可变属性mutable?
- 30. 如何在一个循环中创建一个新的变量
节拍由12秒= [ – KitsuneYMG 2011-02-03 14:45:49
这个例子是从有效的Java拍摄,我相信;-) – darioo 2011-02-03 14:59:26