`
Heis
  • 浏览: 114434 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

大话深入浅出Effective Java核心实战编程思想之——猴王的把戏

阅读更多

不知道大家还记不记得在《西游记》里的莲花洞夺宝的故事,就是猴王巧夺宝物,收复金银角大王那一章。到底这个故事给了我们什么启示呢?这故事又和Effective Java有什么联系?还是延续上篇文章的风格吧,看代码,读故事。

  1 import   static  org.junit.Assert. * ;
  2 import  org.junit.Test;
  3
  4
  5 public   class  TestClone  {
  6     
  7     @Test
  8      public   void  testClone() {    
  9          //  西天取经的路上,金角大王和银角大王把唐僧抓走了         
 10         猴王 齐天大圣 = new  猴王( " 齐天大圣孙悟空 " );
 11          // 大圣手拿金箍棒,正要收拾金、银角大王。
 12         齐天大圣.取得武器( new  金箍棒());
 13         
 14          /**/ /*
 15          * 这时候,金角大王和银角大王听闻大圣来者不善,立马让小妖去请出他们的宝葫芦
 16          * 当然这一切瞒不过神通广大的大圣爷。大圣猴毛一吹,变出一个老道士。
 17           */
        
 18         猴王 空悟孙道士 = (猴王)齐天大圣.变出一个化身();
 19         空悟孙道士.改名( " 空悟孙道士 " );
 20         
 21          /**/ /*
 22          * 老道士忽悠小妖说他的葫芦更厉害,能把天都给收了,智力值只有20的小妖看了羡慕不已,要求交换葫芦。
 23          * 老道士自然很乐意,换了葫芦,直奔妖怪洞穴,收服了金、银角大王。
 24           */

 25         空悟孙道士.取得武器( new  宝葫芦());
 26         
 27          // 问题1:道士拿的是什么武器?道士是由大圣克隆而来,拿的却不是金箍棒,而是宝葫芦?
 28         assertFalse(齐天大圣.的武器()  instanceof  金箍棒);
 29         assertTrue(空悟孙道士.的武器()  instanceof  宝葫芦);
 30         
 31          // 问题2:大圣和道士拿同一个武器?
 32         assertSame(空悟孙道士.的武器(),齐天大圣.的武器());
 33         
 34          // 问题3:既然武器是一样的,为什么名字又不一样呢?
 35         assertEquals(齐天大圣.名字(), " 齐天大圣孙悟空 " );
 36         assertEquals(空悟孙道士.名字(), " 空悟孙道士 " );
 37         
 38          /**/ /*
 39          * 答案:猴王类继承了Object.clone(),其克隆原理是:如果类每个域包含一个原语类型(primitive)的值,
 40          * 或者包含一个指向非可变(final)对象的引用,那么返回的值或对象是一个相同的拷贝;否则,如果是可变类,则会返回相同的引用。
 41          * 因为金箍棒类不是非可变类,而String是,所以你应该明白,为什么大圣爷和他的克隆体有不同的名字,却有相同的武器吧。
 42          * 
 43          * Object.clone()被称为浅拷贝,或浅克隆。相对应的是深克隆(deep clone),他是指类在克隆时也拷贝可变对象。
 44          * 看到这里你应该知道其实这个猴王类实现得不合理,他应该拥有一个深克隆的方法。
 45           */

 46     }

 47
 48      class  猴王  implements  Cloneable {
 49          private  String name;
 50          private  武器[] weapon = new  武器[ 1 ]; 
 51         
 52          public  猴王(String name) {
 53              this .name = name;
 54         }

 55             
 56          /** */ /**
 57          * 取得一个猴王的浅克隆化身
 58          *  @return
 59           */

 60          public  Object 变出一个化身() {
 61             Object cloneObj = null ;
 62              try {
 63                 cloneObj = clone();
 64             }
catch (CloneNotSupportedException ex) {
 65                 ex.printStackTrace();
 66             }

 67              return  cloneObj;
 68         }

 69         
 70         @Override
 71          protected  Object clone()  throws  CloneNotSupportedException {
 72              return   super .clone();
 73         }

 74         
 75          public  String 名字()  {
 76              return  name;
 77         }

 78         
 79          public   void  改名(String name) {
 80              this .name = name;
 81         }

 82
 83          public  武器 的武器()  {
 84              return  weapon[ 0 ];
 85         }

 86
 87          public   void  取得武器(武器 weapon)  {
 88              this .weapon[ 0 =  weapon;
 89         }

 90     }

 91     
 92      class  武器 {
 93          public  武器() {
 94             
 95         }

 96     }

 97     
 98      class  金箍棒  extends  武器 {
 99          public  金箍棒() {
100         }

101     }

102     
103      class  宝葫芦  extends  武器 {
104          public  宝葫芦() {
105         }

106     }

107     
108
109 }

110


        看到这里你应该对深克隆和浅克隆有了初步的了解了吧?现在我们再看怎样深克隆一个猴王,哦,不对,应该是真正猴王的七十二变。(为什么我叫他猴王,因为孙悟空有歧义)。

  1 import   static  org.junit.Assert.assertEquals;
  2 import   static  org.junit.Assert.assertFalse;
  3 import   static  org.junit.Assert.assertNotSame;
  4 import   static  org.junit.Assert.assertTrue;
  5
  6 import  org.junit.Test;
  7
  8
  9 public   class  TestDeepClone  {
 10         
 11     @Test
 12      public   void  testDeepClone() {    
 13          //  西天取经的路上,金角大王和银角大王把唐僧抓走了         
 14         猴王 齐天大圣 = new  猴王( " 齐天大圣孙悟空 " );
 15          // 大圣手拿金箍棒,正要收拾金、银角大王。
 16         齐天大圣.取得武器( new  金箍棒());
 17         
 18          /**/ /*
 19          * 这时候,金角大王和银角大王听闻大圣来者不善,立马让小妖去请出他们的宝葫芦
 20          * 当然这一切瞒不过神通广大的大圣爷。大圣猴毛一吹,变出一个老道士。
 21           */
        
 22         猴王 空悟孙道士 = (猴王)齐天大圣.变出一个化身();
 23         空悟孙道士.改名( " 空悟孙道士 " );
 24         
 25          /**/ /*
 26          * 老道士忽悠小妖说他的葫芦更厉害,能把天都给收了,智力值只有20的小妖看了羡慕不已,要求交换葫芦。
 27          * 老道士自然很乐意,换了葫芦,直奔妖怪洞穴,收服了金、银角大王。
 28           */

 29         齐天大圣.取得武器( new  宝葫芦());
 30         
 31         
 32         assertTrue(空悟孙道士.的武器()  instanceof  金箍棒);
 33         assertFalse(空悟孙道士.的武器()  instanceof  宝葫芦);
 34         assertNotSame(空悟孙道士.的武器(),齐天大圣.的武器());
 35         assertEquals(齐天大圣.名字(), " 齐天大圣孙悟空 " );
 36         assertEquals(空悟孙道士.名字(), " 空悟孙道士 " );
 37     }

 38     
 39      class  猴王  implements  Cloneable {
 40          private  String name;
 41          private  武器 weapon; 
 42         
 43          public  猴王(String name) {
 44              this .name = name;
 45         }

 46             
 47          /** */ /**
 48          * 取得一个猴王的浅克隆化身
 49          *  @return
 50           */

 51</sp
1
0
分享到:
评论

相关推荐

    java版大话西游源码

    《Java版大话西游源码》是一款基于Java编程语言开发的角色扮演游戏(RPG)教程,对于初学者和想要深入理解游戏开发的程序员来说,它提供了丰富的学习资源。这款教程涵盖了多线程技术和自动寻路算法等核心概念,是...

    大话核心网.mobi

    大话核心网.mobi

    OpenFaaS实战之五:大话watchdog(csdn)————程序.pdf

    本文《OpenFaaS实战之五:大话watchdog》重点讨论了OpenFaaS的关键组件watchdog的原理和应用。 在OpenFaaS中,当外部请求到达API Gateway时,它会将请求转发到faas-netes组件。faas-netes作为服务提供者,不仅支持...

    大话JAVA:从零基础到数据库、WEB开发.

    大话Java:从零基础到数据库、Web开发为所有打算深入掌握Java编程的读者编写,适用于初中级程序开发者,没有接触过Java语言的入门者也可以轻松地阅读《大话Java:从零基础到数据库、Web开发》。

    框架封装1.0版本 大话C#之实践场景入门进阶必知点a,深入浅出解析教程

    标题中的“框架封装1.0版本 大话C#之实践场景入门进阶必知点a,深入浅出解析教程”表明这是一个关于C#编程语言的教程,特别关注于实践场景的应用,适合初学者和进阶者。这个教程可能包含了对C#基础的巩固以及高级...

    【资源免费下载】Java代码积累丨大话设计模式(Java实现版本)、线程协作

    Java代码加速器 Java代码积累:并发 设计模式 数据结构 使用容器 实用 类 基础知识 并发性 演示线程的生命周期 生产者-消费者 设计模式参考《大话设计模式》 工厂简单模式 创造型模式 工厂方法模式 抽象工厂模式 ...

    基于《大话设计模式》的Java设计模式学习源码实战

    该项目是一个基于《大话设计模式》的Java设计模式学习源码实战,包含41个文件,其中36个为Java源文件,4个为Markdown文档,以及1个LICENSE文件。通过实际编码实践,帮助开发者深入理解并掌握设计模式的应用。

    大话存储终极版——扫描件

    《大话存储终极版》是IT领域内一本深受读者喜爱的存储技术图书,作者冬瓜哥(张冬)以其通俗易懂的语言,深入浅出地介绍了存储领域的诸多知识。这本书对于初学者来说是一份非常宝贵的资源,可以帮助他们快速入门并...

    java后端学习推荐书籍清单

    《深入浅出Spring Boot2》《图解Java多线程设计模式》 《深入理解Java虚拟机:JVM高级特性与最佳实践》 《深入理解计算机系统(原书第三版》《Netty权威指南 第2版》 《Netty 4核心原理与手写RPC框架实战》 ...

    大话JAVA性能优化

    《大话JAVA性能优化》这份文档深入探讨了Java程序在多个层面的性能调优策略,旨在帮助开发者提高程序运行效率,降低资源消耗,提升用户体验。以下是对这些知识点的详细阐述: 1. **代码层次优化**:在代码编写阶段...

    Android之大话设计模式——:抽象工厂模式借鉴.pdf

    Android之大话设计模式——:抽象工厂模式借鉴.pdf

    大话数据分析:Tableau数据可视化实战----数据集

    总的来说,通过《大话数据分析:Tableau数据可视化实战》的数据集,学习者可以深入实践如何加载数据、构建视图、创建交互式仪表板,并用Tableau来解答业务问题。这涵盖了从数据导入、数据探索、可视化设计到故事呈现...

    大话JAVA性能优化.pdf

    通读《大话Java性能优化》后,读者可以深入了解Java性能调优的许多主题及相关的综合性知识。读者也可以把《大话Java性能优化》作为参考,对于感兴趣的主题,直接跳到相应章节寻找答案。 总的来说,性能调优在很大...

    大话西游之设计模式_从猴王学艺看Decorator 配套代码

    "大话西游之设计模式_从猴王学艺看Decorator"这篇文章将设计模式的概念与经典电影《大话西游》中的故事相结合,以生动有趣的方式讲解了Decorator模式。猴王学艺的过程,就如同我们在编程中逐步增加对象的能力,通过...

    大话西游之设计模式_从猴王出世看singleton 配套代码

    本资源为 "大话西游之设计模式_从猴王出世看singleton"文章的配套代码,通过该代码,可以更加清晰的了解猴王出世故事的流程及代码模拟,也能清楚的知道singleton的全部内容。 该代码在java环境开发,可以正常运行,...

    大话java性能优化 周明耀 完整版

    《大话java性能优化》是周明耀先生的一本深入探讨Java性能调优的专业书籍,其主要内容涵盖了Java程序设计中的各种性能优化策略和技术。这本书旨在帮助开发者理解和掌握如何提升Java应用的运行效率,减少资源消耗,...

    大话java性能优化

    大话java性能优化,大家可以搜一下这本书。这个是完美中文版,建议下载

    Android之大话设计模式——:抽象工厂模式参考.pdf

    Android之大话设计模式——:抽象工厂模式参考.pdf

    大话Java性能优化

    本书 主要 提供 Java 性能 调 优 方面 的 参考 建议 及 经验交流。 作者 力求 做到 知识 的 综合 传播, 而 不是 仅仅 只 针对 Java 虚拟 机 调 优 进行 讲解, 另外 力求 每一 章节 都有 实际 的 案例 支撑。 具体 ...

Global site tag (gtag.js) - Google Analytics