出自《java puzzle》
从前有一个人,他认为世上只有一只不寻常的狗,所以他写出了如下的类,将它作为一个单件(singleton)[Gamma95]:
public class Dog extends Exception {
public static final Dog INSTANCE = new Dog();
private Dog() {}
public String toString(){
return "Woof";
}
}
结果证明这个人的做法是错误的。你能够在这个类的外部不使用反射来创建出第2个Dog实例吗?
这个类可能看起来像一个单件,但它并不是。问题在于,Dog扩展了Exception,而Exception实现了java.io.Serializable。这就意味着Dog是可序列化的(serializable),并且解序列(deserialization)会创建一个隐藏的构造器。正如下面的这段程序所演示的,如果你序列化了Dog.INSTANCE,然后对得到的字节序列(byte sequence)进行解序列,最后你就会得到另外一个Dog。该程序打印的是false,表示新的Dog实例和原来的那个实例是不同的,并且它还打印了Woof,说明新的Dog实例也具有相应的功能:
import java.io.*;
public class CopyDog{ // Not to be confused with copycat
public static void main(String[] args){
Dog newDog = (Dog) deepCopy(Dog.INSTANCE);
System.out.println(newDog == Dog.INSTANCE);
System.out.println(newDog);
}
// This method is very slow and generally a bad idea!
static public Object deepCopy(Object obj){
try{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
new ObjectOutputStream(bos).writeObject(obj);
ByteArrayInputStream bin =
new ByteArrayInputStream(bos.toByteArray());
return new ObjectInputStream(bin).readObject();
} catch(Exception e) {
throw new IllegalArgumentException(e);
}
}
}
要订正这个问题,可在Dog中添加一个readResolve方法,它可以将那个隐藏的构造器转变为一个隐藏的静态工厂(static factory),以返回原来那个的Dog [EJ Items 2,57]。在Dog中添加了这个方法之后,CopyDog将打印true而不是false,表示那个“复本”实际上就是原来的那个实例:
private Object readResolve(){
// Accept no substitues!
return INSTANCE;
}
这个谜题的主要教训就是一个实现了Serializable的单件类,必须有一个readResolve方法,用以返回它的唯一的实例。一个次要的教训就是,有可能由于对一个实现了Serializable的类进行了扩展,或者由于实现了一个扩展自Serializable的接口,使得我们在无意中实现了Serializable。给平台设计者的教训是,隐藏的构造器,例如序列化中产生的那个,会让读者对程序行为的产生错觉.
分享到:
相关推荐
一年级上学期经典诵读篇目.pdf
目的:本研究的目的是评估在说阿拉伯语的环境中的视觉歧视,然后欣赏其障碍在为讲阿拉伯语的读者编写的阿拉伯语... 另一方面,它激发了阅读障碍者的注意力。 4)阅读障碍儿童的视觉辨别障碍发生率为69%(三分之二)。
人教版一年级下册经典诵读.doc
使诵读困难的人更容易使用网络 使阅读困难的人更容易上网,并帮助显示阅读困难的浏览方式。 支持语言:English
北京国学诵读学生客户端!
这个扩展将任何网页转换成诵读困难者更容易阅读的网页。与其他扩展不同,它不需要配置,只需点击一下即可启用/禁用,并在每个选项卡上独立执行。除了改变字体,它还调整对比度和间距,使阅读障碍的人更容易阅读任何...
初中语文语文论文诵读古典诗词提高学生素养
中华经典诗文诵读.ppt
一年级经典诵读篇目.doc
一年级经典诵读展示.doc
一年级上册经典诵读.ppt
初中语文语文论文诵读经典诗文语文教学效果好
初中语文语文论文诗歌诵读着眼于“帮”
陕西省延安市宝塔区柳林镇初级中学初中英语诵读论文 诵读在中学英语教学中的意义.doc
诵读《锦绣中华》文稿.pdf
帮助诵读困难的人 一个在线扩展程序,可以更改网站的外观,并使其对残酷的人们友好。 有了它,我们可以更改字体的颜色,大小和类型。 支持语言:English
初中语文语文论文改革语文教材和考试加强诵读教学
四年级经典诵读教材(上册)小学生必背唐诗宋词.pdf
一年级古诗诵读注释译文.pdf
一年上国学经典诵读.doc