Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建多个对象的单例实例化_Java_Oop_Design Patterns_Singleton - Fatal编程技术网

Java 创建多个对象的单例实例化

Java 创建多个对象的单例实例化,java,oop,design-patterns,singleton,Java,Oop,Design Patterns,Singleton,我试图学习单例设计模式,我遇到了以下示例。但是,我似乎能够创建该类的多个实例 我认为单例的意义在于在任何给定的时间只允许创建一个类的单个实例。有人能解释我在这里遗漏了什么吗?如何验证在任何给定时间仅创建一个对象 public class ChocolateBoiler { private boolean empty; private boolean boiled; private static ChocolateBoiler uniqueInstance; p

我试图学习单例设计模式,我遇到了以下示例。但是,我似乎能够创建该类的多个实例

我认为单例的意义在于在任何给定的时间只允许创建一个类的单个实例。有人能解释我在这里遗漏了什么吗?如何验证在任何给定时间仅创建一个对象

public class ChocolateBoiler {
    private boolean empty;
    private boolean boiled;

    private static ChocolateBoiler uniqueInstance;

    private ChocolateBoiler(){
        empty = true;
        boiled = false;
    }

    public static synchronized ChocolateBoiler getInstance(){
        if(uniqueInstance == null){
            uniqueInstance = new ChocolateBoiler();
        }
        return uniqueInstance;
    }

    public void fill(){
        if(isEmpty()){
            System.out.println("filling");
            empty = false;
            boiled = false;

        }
        System.out.println("already full");
    }

    public boolean isEmpty(){
        System.out.println("empty");
        return empty;

    }

    public boolean isBoiled(){
        System.out.println("boiled");
        return boiled;
    }

    public void drain() {
        if (!isEmpty() && isBoiled()) {
            System.out.println("draining");
            empty = true;
        }
        System.out.println("already empty");
    }

    public void boil(){
        if(!isEmpty() && isBoiled() ){
            System.out.println("boiled");
            boiled = true;
        }
        System.out.println("either empty or not boiled?");
    }

    public static void main(String[] args) {
        ChocolateBoiler boiler1 = new ChocolateBoiler();
        boiler1.fill();
        boiler1.boil();
        boiler1.boil();
        boiler1.drain();
        boiler1.drain();
        boiler1.isEmpty();


        System.out.println("\nboiler 2");
        ChocolateBoiler boiler2 = new ChocolateBoiler();
        boiler2.fill();

        System.out.println("\nboiler 1");
        boiler1.isBoiled();
    }
}

ChocolateBoiler
类中,您可以访问私有构造函数,因此可以创建任意多的实例(如
main
方法中所示)


Singleton模式的要点是,在您的类之外,只能获得一个
Chocketbooler
实例(通过
getInstance
方法),因为私有构造函数不能从外部访问。

为什么您认为它会创建两个实例?您的Singleton模式是正确的,你应该从其他类调用它明白了!我知道事情会很简单。谢谢。所以我尝试使用
ChocolateBoiler tmp=ChocolateBoiler.getInstance()我在com.intellij.rt.execution.application.AppMain.main(AppMain.java:125)的java.lang.Class.getMethod(Class.java:1786)上的线程“main”java.lang.NoSuchMethodException:DesignPatterns.Singleton.ChocolateBoiler.main([Ljava.lang.String;)中遇到了一个奇怪的小错误
异常(getName()+“+name+argumentTypesToString(parameterTypes));
有什么想法吗?@MichaelQuatrani这看起来像是清理旧编译的问题。您是否将主方法移到了一个新类?您的新代码看起来如何?是的,一定是这样。我将main从
Chocketbool
移到了一个单独的类中。