您的位置:首页 > 编程语言 > Java开发

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

2017-07-15 12:32 519 查看
实现Singleton一般方法:

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

}
public static Elvis getInstance(){
return  INSTANCE;
}

}

当然也有需要使用的时候才初始化的方法,这样就要考虑线程安全的问题。

这种初始化的方法在一般使用的时候可以保证是同一个对象,但是在持久化的时候就会出现问题,

持久化过后就会变成两个对象。

示例:

public static void main(String[] args){
File file=new File("hello");
if(!file.exists()){
try {
Elvis elvis=getInstance();
file.createNewFile();
ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream(file));
objectOutputStream.writeObject(elvis);
objectOutputStream.close();
ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream(file));
Elvis elvis1=(Elvis)objectInputStream.readObject();
if(elvis1!=null){
System.out.println(elvis1==elvis);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

false

这种时候,可以添加一个方法解决:

private Object readResolve(){
return INSTANCE;
}

true

这种方式的实现比较复杂,

java1.5发行版本起,实现singleton还有第三种方法,只需要编写一个包含单个元素的枚举类型:

public enum  EumTest {
MYENUM;
public void Test(){
System.out.println("Hello");
}
public String speak(String str){
return  str;
}
}

public class Test {
public static void main(String[] args){
EumTest eumTest=EumTest.MYENUM;
System.out.println(eumTest.speak("Hello,tom"));
eumTest.Test();
EumTest eumTest1=EumTest.MYENUM;
eumTest1.Test();
System.out.println(eumTest==eumTest1);
}
}

true

该方式也无偿提供了序列化机制,绝对防止多次实例化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  enum java
相关文章推荐