我有一份学校作业,我必须在某个特定项目中发现模式。一切都很好(相对而言......)但似乎我发现的大多数模式都是某种变化。我必须找到的单身人士也不例外。
代码如下。关于这一点的奇怪之处在于,这个类似乎没有用以下构造函数实例化,正如人们所期望的那样:
public Singleton() {
if (singleton == null) {
singleton = new Singleton();
}
}
但是,它会使用this
进行设置(您可以在下面的原始代码中看到)?根据我的理解,这会创建某种静态单例?我调试并确实看到第一次构造函数被
Singleton x = new Singleton();
x.Print();
,确实是空的。 this
是一个Singleton实例。但是,不应该有
private static Singleton singleton = new Singleton();
在课堂上而不是singelton = this;
?
public class Singleton {
private static Singleton singleton;
public static Singleton getDefault() {
return singleton;
}
/**
* The constructor.
*/
public Singleton() {
if (singleton == null) {
singleton = this;
}
}
public void Print()
{
System.out.println("I'm a singleton!");
}
}
我很确定它确实是一个单身人士,它只是我从未见过的类型,而且我没有得到它背后的推理,这就是我基本上要求的。
答案 0 :(得分:1)
创建Singleton类通常有两种方法,两种方法都基于保持构造函数的私有性 第一种方法:
public class Singleton
{
public static final Singleton INSTANCE = new Singleton();
private Singleton{...}
}
您可以创建如下实例:Singleton single = Singleton.INSTANCE;
第二种方法:
public class Singleton
{
private static final Singleton INSTANCE = new Singleton();
private Singleton(){...}
public static Singleton getInstance(){ return INSTANCE; }
}
在这种情况下,您可以创建一个这样的实例:Singleton single = Singleton.getInstance(); 然后将getInstance()方法视为公共工厂方法。
正如您所看到的,在这两种情况下,new关键字肯定用于创建类的单个实例,但由于使用了模式,因此只能有一个实例而不能更多。您不需要使用“this”关键字。 希望这会有所帮助。
答案 1 :(得分:0)
您的代码不遵循Singleton
模式。我在Singleton模式后面显示了一个类。 this
指的是当前的对象实例。在构造函数中使用this
初始化单例引用时,它会调用默认(no-args)构造函数并将其分配回this
引用,然后将其分配给singleton
类成员变量
public class Singleton {
private static Singleton singleton;
public static Singleton getDefault() {
if (singleton == null)
singleton = new Singleton();
return singleton;
}
/**
* The constructor.
*/
private Singleton() {
System.out.println(singleton);
if (singleton == null) {
/*this will call a default constructor
*and instantiate Singleton object
*/
singleton = this;
}
}
public void Print() {
System.out.println("I'm a singleton!");
}
public static void main(String[] args) {
Singleton singleton = Singleton.getDefault();
System.out.println(singleton.Print());
}
}
希望你能理解!
答案 2 :(得分:0)
我认为你的意思令人困惑或this
。 this
未实例化类,this
引用新创建的实例。然后,每当有人调用您的构造函数时,无论您是否存储在private static Singleton singleton;
中,都会创建(并返回)新实例。
同样说@ dic19你必须使你的构造函数private
防止存在多个实例。
如果要点不是如你所说的那样修改代码,那么关键是要报告这个类不是单例。
您可以查看调试:
Singleton x = new Singleton();
Singleton x1 = new Singleton();
Singleton x2 = new Singleton();
你会看到这三个都是不同的实例,只是你创建的第一个Singleton.getDefault()
。
答案 3 :(得分:0)
如果我们使用singletone
,我们不需要创建实例以供使用。因为当我们创建singletone
时,如果没有创建,我们就会创建new instance
。
看看下面的代码:
public class Singleton {
private static Singleton singleton;
private Singleton() {
}
public static Singleton getSingleton() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
public void testSingleTone(){
System.out.println("test");
}
public static void main(String[] args){
Singleton.getSingleton().testSingleTone();
}
}