有些對(duì)象根據(jù)需求需要保證其唯一性,此時(shí)需要用單例模式,單例模式采用枚舉是最好的解決方式
package com.liangliang.coreJava.OOP.eum;
public enum Elvis
{
INSTANCE("Solar","25");
private final String name;
private final String age;
private Elvis(String name,String age){
this.name=name;
this.age =age;
}
public void leaviBuilding(){
System.out.println("name="+name+",age="+age);
}
public static Elvis getInstance(){
return Elvis.INSTANCE;
}
}
1、代碼簡(jiǎn)單
2、可以防止序列化時(shí)破壞單例
3、線(xiàn)程安全,不需要考慮雙重鎖的問(wèn)題
通過(guò)反編譯后代碼我們可以看到,public final class T extends Enum,說(shuō)明,該類(lèi)是繼承了Enum類(lèi)的,
同時(shí)final關(guān)鍵字告訴我們,這個(gè)類(lèi)也是不能被繼承的。當(dāng)我們 使用enmu來(lái)定義一個(gè)枚舉類(lèi)型的時(shí)候,編
譯器會(huì)自動(dòng)幫我們創(chuàng)建一個(gè)final類(lèi)型的類(lèi)繼承Enum類(lèi),所以枚舉類(lèi)型不能被繼承,我們看到這個(gè)類(lèi)中有幾
個(gè)屬性和方法。
public final class T extends Enum
{
private T(String s, int i)
{
super(s, i);
}
public static T[] values()
{
T at[];
int i;
T at1[];
System.arraycopy(at = ENUM$VALUES, 0, at1 = new T[i = at.length], 0, i);
return at1;
}
public static T valueOf(String s)
{
return (T)Enum.valueOf(demo/T, s);
}
public static final T SPRING;
public static final T SUMMER;
public static final T AUTUMN;
public static final T WINTER;
private static final T ENUM$VALUES[];
static
{
SPRING = new T("SPRING", 0);
SUMMER = new T("SUMMER", 1);
AUTUMN = new T("AUTUMN", 2);
WINTER = new T("WINTER", 3);
ENUM$VALUES = (new T[] {
SPRING, SUMMER, AUTUMN, WINTER
});
}
}
因?yàn)閟tatic類(lèi)型的屬性會(huì)在類(lèi)被加載之后被初始化,當(dāng)一個(gè)Java類(lèi)第一次被真正使用到的時(shí)候靜態(tài)資源被初始化、Java類(lèi)的加載和初始化過(guò)程都是線(xiàn)程安全的。
所以,創(chuàng)建一個(gè)enum類(lèi)型是線(xiàn)程安全的。