我有一项学校作业,我必须在某个给定项目中发现模式。一切都很好(嗯,相对地..)但我发现的大多数模式似乎都是某种变化。我必须找到的单例也不异常(exception)。
代码如下。奇怪的是,这个类似乎没有像人们期望的那样使用以下构造函数进行实例化:
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!");
}
}
我很确定它确实是一个单例,它只是我从未见过的类型,我也不知道背后的原因,这就是我的基本要求。
最佳答案
通常有两种创建单例类的方法,都基于保持构造函数私有(private)。
第一种方法:
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() 方法视为公共(public)工厂方法。
如您所见,在这两种情况下,new 关键字肯定用于创建类的单个实例,但由于所使用的模式,只能有一个实例,不能有更多。您不需要使用“this”关键字。 希望这会有所帮助。
关于java - 用这个实例化的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21956333/