有些对象根据需求需要保证其唯一性,此时需要用单例模式,单例模式采用枚举是最好的解决方式
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、代码简单
2、可以防止序列化时破坏单例
3、线程安全,不需要考虑双重锁的问题
通过反编译后代码我们可以看到,public final class T extends Enum,说明,该类是继承了Enum类的,
同时final关键字告诉我们,这个类也是不能被继承的。当我们 使用enmu来定义一个枚举类型的时候,编
译器会自动帮我们创建一个final类型的类继承Enum类,所以枚举类型不能被继承,我们看到这个类中有几
个属性和方法。
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
});
}
}
因为static类型的属性会在类被加载之后被初始化,当一个Java类第一次被真正使用到的时候静态资源被初始化、Java类的加载和初始化过程都是线程安全的。
所以,创建一个enum类型是线程安全的。
网友评论