出自《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。给平台设计者的教训是,隐藏的构造器,例如序列化中产生的那个,会让读者对程序行为的产生错觉.
分享到:
相关推荐
目的:本研究的目的是评估在说阿拉伯语的环境中的视觉歧视,然后欣赏其障碍在为讲阿拉伯语的读者编写的阿拉伯语... 另一方面,它激发了阅读障碍者的注意力。 4)阅读障碍儿童的视觉辨别障碍发生率为69%(三分之二)。
小学一年级经典诵读内容(拼音版).doc
【标题与描述解析】: 这篇文档是一个关于在中学英语教学中强调诵读重要性的研究论文,源自陕西省延安市宝塔区柳林镇初级中学。论文探讨了诵读在提高学生的英语听、说、读、写能力方面的关键作用,并针对农村中学的...
互联网诵读音频是指通过网络平台播放的以朗读为主要内容的音频作品,这类作品随着移动互联网的普及和发展,逐渐成为文化传播和知识分享的重要方式之一。互联网诵读音频的意义和特征表现在多个方面,它不仅能够深化...
高中阶段的学生已经积累了一定量的古诗词,具备一定的诵读能力,对音韵之美的感知也更敏锐深入。扫除字词障碍,可以帮助学生更好地理解古诗词的内容和美感,从而激发古诗词诵读兴趣。 其次,训练提升学生的诵读能力...
【人教版一年级下册经典诵读】是针对低年级学生设计的一份教育资源,旨在通过经典文本的学习,培养孩子们对中国传统文化的理解和兴趣。其中提到的《三字经》是中国传统启蒙教育的重要教材,与《百家姓》、《千字文》...
这些内容是中国小学一年级上学期的经典诵读篇目,包含了唐代多位著名诗人的诗词作品,旨在让学生接触并学习中国的古典文学,感受诗词之美。以下是各诗词的详细解析: 1. 《咏鹅》(唐·骆宾王) 这首诗是骆宾王在7...
2. 诵读比赛的主题:文中提到的诵读比赛主题是“诵读国学经典,传承华夏文明”,强调了对中国传统文化的尊重和传承,国学经典是中华文化的瑰宝,通过诵读可以深入理解其内涵。 3. 国学经典的概念:国学经典包括古代...
调查设计基于两方面的考虑:一是小学古诗文诵读研究的方向和目标,二是依据新课程标准对阅读教学的基本要求,确保调查的科学性和实用性。 三、调查实施 1. 问卷形式:采用不记名的集中式调查,以保护学生的隐私。 ...
【教育精品资料】系列活动中,小学四年级的学生们在教师的指导下进行了一系列的国学经典诵读活动。这些活动旨在让学生深入理解中国古代哲学思想,尤其是儒家的“仁”这一核心概念。以下是各周活动的详细内容及其教育...
使诵读困难的人更容易使用网络 使阅读困难的人更容易上网,并帮助显示阅读困难的浏览方式。 支持语言:English
北京国学诵读学生客户端!
一、基本理念: 1.继承和发扬中华优秀文化传统,弘扬以爱国主义为核心的民族精神,培养良好的思想道德风尚。 2.遵守国家通用语言文字法律法规,倡导用普通话诵读诗文,用规范字书写诗文。 3.遵循学生身心发展特点和...
【标题】和【描述】提及的是一个关于"国学经典诵读诵读阶段总结"的文档,这是一项在学校中进行的活动,旨在让学生通过诵读国学经典来接触和理解中华民族的优秀传统文化,培养学生的道德情操和民族精神。下面将详细...
这个扩展将任何网页转换成诵读困难者更容易阅读的网页。与其他扩展不同,它不需要配置,只需点击一下即可启用/禁用,并在每个选项卡上独立执行。除了改变字体,它还调整对比度和间距,使阅读障碍的人更容易阅读任何...
每天背诵一至两首诗词,并定期进行复习和巩固,如10首为一个小阶段,之后进行总复习。同时,根据学生的接受能力调整进度,对于困难的学生给予个别辅导,确保每个学生都能跟上进度。 再次,教授有效的背诵方法。教师...
这篇语文论文强调了诵读经典诗文在初中语文教学中的积极影响。诵读经典诗文不仅可以提高学生的语文素养,还能在多方面对学生的人格发展产生积极作用。以下是对论文内容的详细解析: 首先,诵读经典诗文有助于营造...
既然诵读被认为是语文学习的关键,教材应强化这一要求,同时,考试也要相应调整,更多地考察学生的背诵能力。减少阅读理解题的数量,转而增加课文默写的分数占比,使诵读教学得到应有的反馈。 最后,改革试卷默写...
【中华古诗文经典诵读活动方案】 中华古诗文是中华文化的重要载体,承载着中华民族的精神内涵和价值取向。开展中华古诗文经典诵读活动,旨在提升学生的人文素养,激发他们对传统文化的热爱,同时促进他们的全面发展...
- 教师角色:教师不仅是引导者,也需要深入学习,做到与学生同步,以提高自身的国学素养。 - 教研同步:国学经典诵读应作为研究课题,通过实践、研究、总结和交流,提升教学效果。 4. 教学进度规划:教案详细列出...