我想创建一个类的单个实例。我如何在Java中创建一个类的单个实例?Java类的单个实例
回答
要创建一个类的真正单个实例(意味着在JVM级别的单例),您应该让您的类成为Java enum
。
public enum MyClass {
INSTANCE;
// Methods go here
}
单例模式使用静态状态,因此单元测试时通常会导致严重后果。
这在Joshua Bloch的Effective Java的第3项中有解释。
确切地说,singleton只会在classloader级别,必须控制JVM中的所有类加载器才能够保证JVM级别的单例。 – pgras 2010-01-14 09:29:35
我认为您会发现这是对枚举打算执行的操作的滥用。枚举适用于多个相关项目(例如一周中的几天),以便您可以使用类型安全的方式执行切换/比较等。它们不适用于类的单个实例。不管您如何实现它,单身人士都会因为不同的类加载器结构而变得复杂。 – Shane 2010-02-01 22:18:25
@Shane,请参阅Effective Java。 Java枚举不仅仅是其他语言中可用的简单枚举。 – gpampara 2010-02-02 05:36:36
非常基本单的设计模式。
public class Singleton {
private static Singleton instance;
static {
instance = new Singleton();
}
private Singleton() {
// hidden constructor
}
public static Singleton getInstance() {
return instance;
}
}
您还可以使用懒人支架模式以及
public class Singleton {
private Singleton() {
// hidden constructor
}
private static class Holder {
static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}
,直到您访问的getInstance()这个版本将无法创建单例的实例,但由于方式的JVM /类加载器处理内部类的创建,保证只有构造函数调用一次。
说明: 我不认为没有办法限制构造函数的执行。 解决的办法是:使构造函数为私有 - 这样任何人都无法从外部调用它。 使用静态函数初始化对象的唯一实例 - 如果它是NULL,则在内部调用构造函数。 – effkay 2010-01-14 06:34:45
我对此的唯一改进是单例的延迟初始化。 – 2010-01-14 06:48:39
为什么静态阻止?您可以在声明它的同一行上初始化实例。 @Taylor L您不一定总是需要懒惰的init,这取决于应用程序的其余部分及其引导要求。 – 2010-01-14 09:15:46
In Java, how can we have one instance of the BrokerPacket class in two threads?
以便所有线程更新都将不同的BrokerLocation存储在一个位置数组中。 例如:
class BrokerLocation implements Serializable {
public String broker_host;
public Integer broker_port;
/* constructor */
public BrokerLocation(String host, Integer port) {
this.broker_host = host;
this.broker_port = port;
}
}
public class BrokerPacket implements Serializable {
public static BrokerLocation locations[];
}
- 1. WebApplication有2个单例类的实例
- 2. 单个实例/基类
- 3. Java类实例化
- 4. 类实例化Java
- 5. SwingWorker类的Java GUI和多个实例
- 6. Python中的类的单个实例
- 7. 实例化单例类
- 8. 单类实例C++
- 9. ATL COM类的单个实例
- 10. 设置为单个类的实例
- 11. 无法实例类型的实例在Java中的Weka类
- 12. 在java中释放单例的实例
- 13. 实例化一个泛型类(JAVA)
- 14. Java:仅允许一个类实例化
- 15. java中单实例类的最佳实践是什么?
- 16. 用于子类实例的Java浅拷贝超类实例
- 17. java中的单例类API
- 18. 为什么在Java中的类实例中返回一个类实例?
- 19. Java中,一个类的多个实例重置最新创建的实例
- 20. Java;全局类实例?
- 21. Java 8 Innner类实例化
- 22. Java枚举类型实例
- 23. ASMX服务共享单个类实例
- 24. Java - 循环遍历一个类的实例,而不是调用每个单独实例的方法
- 25. 在java的另一个类中存储类的实例
- 26. 一个类实例
- 27. 为Actionscript实现单例类
- 28. Java单例内部类
- 29. 与Java中的同一类的单独实例冲突
- 30. 如何扩展由另一个类实例化的java类?
'new MyClass()'once once once? – 2010-01-14 06:21:16
OT - 引用了前面的问题:“我非常熟悉java编程语言” - girinie,说实话,我没有想到这个问题 - 你必须在攻击你的网上商店项目之前提高你的Java技能(http: //stackoverflow.com/questions/2055016/web-site-design-idea-closed)!至少你应该知道(主人?)GoF模式。 – 2010-01-14 08:33:01