出自《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.遵循学生身心发展特点和...
【标题】和【描述】提及的是一个关于"国学经典诵读诵读阶段总结"的文档,这是一项在学校中进行的活动,旨在让学生通过诵读国学经典来接触和理解中华民族的优秀传统文化,培养学生的道德情操和民族精神。下面将详细...
这个扩展将任何网页转换成诵读困难者更容易阅读的网页。与其他扩展不同,它不需要配置,只需点击一下即可启用/禁用,并在每个选项卡上独立执行。除了改变字体,它还调整对比度和间距,使阅读障碍的人更容易阅读任何...
既然诵读被认为是语文学习的关键,教材应强化这一要求,同时,考试也要相应调整,更多地考察学生的背诵能力。减少阅读理解题的数量,转而增加课文默写的分数占比,使诵读教学得到应有的反馈。 最后,改革试卷默写...
《中华诵--国学经典诵读教案-(四年级下册)》为教师提供了一个系统的教学方案,旨在让学生通过诵读经典,来传承和弘扬中华文化的精髓。 首先,国学经典的重要性不容忽视。它们是中华文明五千年积淀的结晶,蕴含着...
【中华古诗文经典诵读活动方案】 中华古诗文是中华文化的重要载体,承载着中华民族的精神内涵和价值取向。开展中华古诗文经典诵读活动,旨在提升学生的人文素养,激发他们对传统文化的热爱,同时促进他们的全面发展...
在当今社会的教育环境中,诵读经典诗文已成为初中语文教学中不可或缺的一环。尤其是在培养学生语文素养、陶冶情操以及深化对传统文化的理解等方面,经典诗文诵读显示出了显著的教学效果。本篇论文将详细探讨诵读经典...