Singleton模式未在我的Java代码中返回相同的对象

问题描述 投票:0回答:2

我的代码有什么错误吗?因为该变量在应用单例模式时不会更改其值。

我的代码:

class Singleton{

private final static Supplier<Singleton> INSTANCE = Singleton::new;
private int variable = 33;


public static synchronized Supplier<Singleton> getInstance() { 
    return INSTANCE;
}

void print(){
    System.out.println(variable);
}

void change(int variable){
    this.variable = variable;
}

}

public class Design {

public static void main(String[] args) {
    Singleton.getInstance().get().print(); // print 33
    Singleton.getInstance().get().change(99);
    Singleton.getInstance().get().print(); // need to print 99 but it prints 33

}

}

请纠正我,如果我在实施Singleton Pattern时错了。

java design-patterns functional-interface
2个回答
1
投票
您的供应商是一个单例,但每次调用Supplier.get()时都会创建一个假定的单例新实例,因为每个调用都调用Singleton :: new返回一个新的非单例实例。

[尝试实施singetons很困难,通常(如果不是不良作业的一部分)是不良设计的标志。原因是S.T.U.P.I.D.中的“ S”。代码代表Singleton。只有极少数情况下需要使用Singleton,而这些情况通常应由框架代码处理。


0
投票
这是因为每次对get方法的调用都会实例化一个新对象,并且Singleton设计模式没有很好地实现,因此,有很多教程实现了Singleton设计模式,但是如果您坚持使用Supplier接口,那么我会进行更改您的Singleton班级,似乎很不错:

import java.util.function.Supplier; class Singleton implements Supplier<Singleton> { private static final Singleton INSTANCE = new Singleton(); private int variable = 33; private Singleton() { } public static synchronized Singleton getInstance() { return INSTANCE; } void print() { System.out.println(variable); } void change(int variable) { this.variable = variable; } @Override public Singleton get() { return this; } }

© www.soinside.com 2019 - 2024. All rights reserved.