Singleton in action with enum- the preferred approach
- 测试困难,因为无法给singleton替换模拟实现,除非它实现充当其类型的接口。
jdk5以前,都是把构造器声明为私有,导出公有静态成员;
//Singleton with public final field
public class Elvis{public static final Elvis INSTANCE = new Elvis();
private Elvis(){...}
public void leaveTheBuildings(){...}
这种方法,使用反射机制,设置AccessibleObject.setAccessible,会允许其访问私有构造函数。
静态工厂方法的实现:
//Singleton with static factory
public class Elvis{
private static final Elvis INSTANCE = new Elvis();
private Elvis(){...}
private static Elvis getInstanceJ(){
return INSTANCE;}
public void leaveTheBuilding(){...}
}
在性能上无优势,其优势是灵活性。但是在反序列化的时候会生成一个新的实例,要实现readResolve方法。
在JDK5以后可以使用新的枚举技术实现singleton,而且提供了序列化机机制,也就是说以后生成单例模式就直接使用这种方法就可以了。
结论:单元素的枚举类型已经成为实现singleton的最佳方法,代码如下:
//Enum singleton - the preferred approach
public enum Elvis{
INSTANCE("zhang san",1);
private String name;
private int no;
private Elvis(String name, int no){
this.name = name;
this.no = no;
}
public void leaveTheBuilding(){...}
}
也就是说单例的方式的实现通过只有一个枚举值的方法来实现。
枚举的相关知识
向枚举中添加新方法
如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。
public enum Color {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
// 普通方法
public static String getName(int index) {
for (Color c : Color.values()) {
if (c.getIndex() == index) {
return c.name;
}
}
return null;
}
// get set 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
枚举实现接口
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
public interface Behaviour {
void print();
String getInfo();
}
public enum Color implements Behaviour{
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
// 成员变量
private String name;
private int index;
// 构造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//接口方法
@Override
public String getInfo() {
return this.name;
}
//接口方法
@Override
public void print() {
System.out.println(this.index+":"+this.name);
}
}
使用接口组织枚举
public interface Food {
enum Coffee implements Food{
BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
}
enum Dessert implements Food{
FRUIT, CAKE, GELATO
}
}
还没有评论,来说两句吧...