枚舉是創建單身人士的好。我知道枚舉方法不是線程安全的,所以我試圖讓它是線程安全的。任何人都可以確認這個實現是否正確。使用靜態和易變的這麼多地方是否可以,並且可以優化?由於內部類是私有的,所以我必須在枚舉中創建函數來訪問內部類的功能。可以優化嗎?線程安全枚舉單身人士
import java.util.Date;
public enum SingletonWithEnum {
INSTANCE;
private static class Singleton{
private static volatile int count;
private static volatile Date date;
public static int getCount() { return count;}
public static void setCount(int countParam) { synchronized(Singleton.class){ count = countParam; }}
public static Date getDate() { return date;}
public static void setDate(Date dateParam) { synchronized(Singleton.class){ date = dateParam;}}
public static String printObject() {
return "Singleton [count=" + getCount() + ", date=" + getDate() + "]";
}
}
public int getCount() { return Singleton.getCount();}
public void setCount(int countParam) {Singleton.setCount(countParam);}
public Date getDate() { return Singleton.getDate();}
public void setDate(Date dateParam) {Singleton.setDate(dateParam);}
public String toString(){return Singleton.printObject();}
};
我正在像這樣使用它。
SingletonWithEnum object1 = SingletonWithEnum.INSTANCE;
object1.setCount(5);
object1.setDate(new Date());
「我知道枚舉方法不是線程安全的」 - 好吧,只有當你*使它們不安全。枚舉通常是無狀態的,此時它們完全是線程安全的。 – 2015-02-06 15:25:52
在這裏使用枚舉對我來說似乎很奇怪。他們打算列舉一些東西,所以這是濫用它。 – 2015-02-06 16:33:33
@IngoBürk將單個實例的枚舉用作單例是一種非常常見的模式。實際上,枚舉在JVM中只創建一次,所以完美地代表單身人士。有關該主題的更多信息,請參閱Josh Bloch的「Effective Java」。 – 2015-02-06 16:44:56