Java 尝试升级Singelton以准确获取一个对象的两个实例
我喜欢升级Java 尝试升级Singelton以准确获取一个对象的两个实例,java,singleton,Java,Singleton,我喜欢升级单例模式以获得2个输入 这就是我尝试过的: public class Singelton_2 { public static void main(String[] args) { Singelton odellBeckhamJr = Singelton.getIntance(); } } class Singelton { private static Singelton obj; private Singelton() { }
单例模式以获得2个输入
这就是我尝试过的:
public class Singelton_2 {
public static void main(String[] args) {
Singelton odellBeckhamJr = Singelton.getIntance();
}
}
class Singelton {
private static Singelton obj;
private Singelton() { }
public static Singelton getIntance() {
if (obj == null) {
obj = new Singelton();
}
return obj;
}
}
但到目前为止,我没有成功。你能帮我吗?不要这样做
singleton
模式的设计目的是让您恰好获得对象的一个实例。改变它,可能会导致问题。此外,你不需要它
如果您想要一个“双单例”,只需在一个不可变的列表或数组中创建一个包含2个对象的单例。如果愿意,可以从单例上的函数返回此列表
您甚至可以将其称为工厂
,这是一个单例对象提供程序
因此,似乎有些稍有不同的东西将被称为multiton
…^^^参见上面@Turing85的答案您还可以在构造函数中放置一个静态计数器,以计算该类创建了多少个对象。如果您只想创建两个,然后检查两个,在两次计数后,您只需返回旧对象。首先,我建议在创建类时实例化singleton实例:
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
// hide constructor
}
public static Singleton getInstance() {
return INSTANCE;
}
}
这保证了实例的线程安全实例化。如果需要及时,可以使用
如果应创建两个实例(即,一种特殊形式的),我建议复制上述解决方案:
public class Doubleton {
private static final Doubleton INSTANCE_ONE = new Doubleton();
private static final Doubleton INSTANCE_TWO = new Doubleton();
private static final List<Doubleton> INSTANCES = List.of(INSTANCE_ONE, INSTANCE_TWO);
private Doubleton() {
// hide constructor
}
public static Doubleton getInstanceOne() {
return INSTANCE_ONE;
}
public static Doubleton getInstanceTwo() {
return INSTANCE_TWO;
}
public static List<Doubleton> getInstances() {
return INSTANCES;
}
}
public-class-Doubleton{
私有静态最终Doubleton实例_ONE=新的Doubleton();
私有静态最终Doubleton实例_TWO=新的Doubleton();
私有静态最终列表实例=List.of(实例1,实例2);
二等兵{
//隐藏构造函数
}
公共静态Doubleton getInstanceOne(){
返回实例1;
}
公共静态Doubleton getInstanceTwo(){
返回实例2;
}
公共静态列表getInstances(){
返回实例;
}
}
需要版本9或更高版本的Java
提供了一个有趣的替代方案。到目前为止,限制实例数量的最简单方法是使用枚举:
enum Doubleton {
INSTANCE1, INSTANCE2
}
这甚至抵制实例的反射创建,因此保证只有两个实例
如果要惰性地实例化实例,最简单的方法是:
但是您应该仔细评估延迟初始化是否真的是一个必需属性。您的问题是什么?我喜欢更改代码以获得两个实例您是否发明了一个Doubleton
?您好@Chris,Singleton的概念是在整个应用程序中只拥有该对象的一个实例,这就是你的代码一直在做的。请详细说明您想要实现的目标,以便我们能够提供帮助是的,我只想要一个Doubleton,以确保只可能创建两个实例。谢谢Turing85@瑞克·杰普,谢谢你的提醒。我已经改正了错误。我的评论很快就会自毁。双重检查锁定很难正确实现(在有效的Java第三版中,它的实现甚至有一个输入错误)。LazyHolder非常简单。唯一的缺点是:您不可能进行即时实例化。否则,对于Enum
来说,这是一个有趣的用例,我到目前为止还没有考虑过。@Turing85您具有与静态final字段完全相同的即时实例化可能性。如果没有正确的同步,这将导致多线程环境中出现问题。一般来说,我建议不要及时创建实例。是的,正确。@Turing85
class Doubleton {
private Doubleton() {}
static Doubleton instance1() {
return Holder1.X;
}
static Doubleton instance2() {
return Holder2.X;
}
private static class Holder1 {
static final Doubleton X = new Doubleton();
}
private static class Holder2 {
static final Doubleton X = new Doubleton();
}
}