我從http://www.oracle.com/technetwork/articles/java/singleton-1577166.html這裏瞭解了Singleton模式,並且介紹了一些常見的實現錯誤。我只想檢查我寫的這些程序是否證明了他們的不正確。這是錯誤的單例模式實現的正確演示嗎?
在第一個程序中,我創建了一個繼承的類,並調用基類的受保護構造函數。這使我可以創建2個Singleton實例。
import java.util.*;
import java.lang.*;
import java.io.*;
class Singleton {
public static Singleton Instance() {
if (_instance == null) {
_instance = new Singleton();
return _instance;
}
return _instance;
}
protected Singleton() {}
private static Singleton _instance = null;
}
class SingletonBasher extends Singleton {
public SingletonBasher() {
}
}
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
Singleton x = new Singleton();
Singleton y = SingletonBasher.Instance();
if(x != y)
System.out.println("fail!");
}
}
在第二個節目我只是創造了新的使用操作的兩個對象,這工作,因爲構造函數是受保護的。如果它是私人的,我會被迫使用實例方法,它只會允許我創建1個實例。
import java.util.*;
import java.lang.*;
import java.io.*;
class Singleton {
public static Singleton Instance() {
if (_instance == null) {
_instance = new Singleton();
return _instance;
}
return _instance;
}
private Singleton() {}
private static Singleton _instance = null;
}
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
Singleton x = Singleton.Instance();
Singleton y = Singleton.Instance();
if(x != y)
System.out.println("fail!");
}
}
您的'return _instance;'是多餘的,並以方法名稱中的小型大寫字母開頭:)。在某些情況下,您可能需要使用同步。 – Enzokie
@Enzokie沒有'return'語句我得到一個編譯錯誤:http://ideone.com/MLXf3E –
取消註釋其他返回語句不是那一個。 – Enzokie