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();
  }
}