您的位置:首页 > 其它

3、用私有构造器或者枚举类型强化SIngleton属性

2016-06-07 22:29 369 查看

结论

单元素的枚举类型已经成为实现Singleton的最佳方法

Singleton模式

常见的Singleton有两种方式,第一种:

public class Elvis {
//被定义为final的,不可改变的
public static final Elvis INSTANCE = new Elvis();

private Elvis() {
}

public void leaveTheBuilding() {
System.out.println("Whoa baby, I'm outta here!");
}

// This code would normally appear outside the class!
public static void main(String[] args) {
Elvis elvis = Elvis.INSTANCE;
elvis.leaveTheBuilding();
}
}


第二种方式:

public class Elvis {
private static final Elvis INSTANCE = new Elvis();

private Elvis() {
}
//定义为静态方法
public static Elvis getInstance() {
return INSTANCE;
}

public void leaveTheBuilding() {
System.out.println("Whoa baby, I'm outta here!");
}

// This code would normally appear outside the class!
public static void main(String[] args) {
Elvis elvis = Elvis.getInstance();
elvis.leaveTheBuilding();
}
}


让Singleton变成可序列化的

为了让反序列化的时候只创建一个对象

public class Elvis {
public static final Elvis INSTANCE = new Elvis();

private Elvis() {
}

public void leaveTheBuilding() {
System.out.println("Whoa baby, I'm outta here!");
}

private Object readResolve() {
// Return the one true Elvis and let the garbage collector
// take care of the Elvis impersonator.
return INSTANCE;
}

// This code would normally appear outside the class!
public static void main(String[] args) {
Elvis elvis = Elvis.INSTANCE;
elvis.leaveTheBuilding();
}
}


使用枚举实现单例模式

无偿提供了序列化的机制,绝对防止多次实例化

public enum Elvis {
INSTANCE;

public void leaveTheBuilding() {
System.out.println("Whoa baby, I'm outta here!");
}

// This code would normally appear outside the class!
public static void main(String[] args) {
Elvis elvis = Elvis.INSTANCE;
elvis.leaveTheBuilding();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: