仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 725|回复: 19
打印 上一主题 下一主题

[学习教程] 来看RTTI无害吗

[复制链接]
只想知道 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:34:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
而学习JAVA我觉得最应该避免的就是:只学习,不思考,只记忆,不实践!
本章的各类计划计划都在勉力制止利用RTTI,这也许会给人人留下“RTTI无害”的印象(还记得不幸的goto吗,因为给人印象欠安,基本就没有放到Java里来)。但实践情形并不是相对云云。准确地说,应当是RTTI利用不妥才“无害”。我们之以是想制止RTTI的利用,是因为它的毛病使用会形成扩大性遭到伤害。而我们事条件出的方针就是能向体系自在到场新范例,同时包管对四周的代码形成尽量小的影响。因为RTTI常被滥用(让它查找体系中的每品种型),会形成代码的扩大才能年夜打扣头——增加一种新范例时,必需找出利用了RTTI的一切代码。即便仅漏掉了个中的一个,也不克不及从编译器那边失掉任何匡助。
但是,RTTI自己其实不会主动发生非扩大性的代码。让我们再来看一看后面提到的渣滓接纳例子。这一次筹办引进一种新工具,我把它叫作TypeMap。个中包括了一个Hashtable(散列表),个中包容了多个Vector,但接口十分复杂:能够增加(add())一个新对象,能够取得(get())一个Vector,个中包括了属于某种特定范例的一切对象。关于这个包括的散列表,它的关头在于对应的Vector里的范例。这类计划计划的长处(依据LarryOBrien的倡议)是在碰到一种新范例的时分,TypeMap会静态到场一种新范例。以是不论甚么时分,只需将一种新范例到场体系(即便在运转时代增加),它也会准确无误地得以承受。
我们的例子一样创建在c16.Trash这个“包”(Package)内的Trash范例布局的基本上(并且那儿利用的Trash.dat文件能够照搬到这里来)。
  1. //:DynaTrash.java
  2. //UsingaHashtableofVectorsandRTTI
  3. //toautomaticallysorttrashinto
  4. //vectors.Thissolution,despitethe
  5. //useofRTTI,isextensible.
  6. packagec16.dynatrash;
  7. importc16.trash.*;
  8. importjava.util.*;
  9. //GenericTypeMapworksinanysituation:
  10. classTypeMap{
  11. privateHashtablet=newHashtable();
  12. publicvoidadd(Objecto){
  13. Classtype=o.getClass();
  14. if(t.containsKey(type))
  15. ((Vector)t.get(type)).addElement(o);
  16. else{
  17. Vectorv=newVector();
  18. v.addElement(o);
  19. t.put(type,v);
  20. }
  21. }
  22. publicVectorget(Classtype){
  23. return(Vector)t.get(type);
  24. }
  25. publicEnumerationkeys(){returnt.keys();}
  26. //Returnshandletoadapterclasstoallow
  27. //callbacksfromParseTrash.fillBin():
  28. publicFillablefiller(){
  29. //Anonymousinnerclass:
  30. returnnewFillable(){
  31. publicvoidaddTrash(Trasht){add(t);}
  32. };
  33. }
  34. }
  35. publicclassDynaTrash{
  36. publicstaticvoidmain(String[]args){
  37. TypeMapbin=newTypeMap();
  38. ParseTrash.fillBin("Trash.dat",bin.filler());
  39. Enumerationkeys=bin.keys();
  40. while(keys.hasMoreElements())
  41. Trash.sumValue(
  42. bin.get((Class)keys.nextElement()));
  43. }
  44. }///:~
复制代码
只管功效很强,但对TypeMap的界说长短常复杂的。它只是包括了一个散列表,同时add()包袱了年夜部分的事情。增加一个新范例时,那品种型的Class对象的句柄会被提掏出来。随后,使用这个句柄判别包容了那类对象的一个Vector是不是已存在于散列表中。如谜底是一定的,就提掏出谁人Vector,并将对象到场个中;反之,就将Class对象及新Vector作为一个“键-值”对到场。
使用keys(),能够失掉对一切Class对象的一个“列举”(Enumeration),并且可用get(),可经由过程Class对象猎取对应的Vector。
filler()办法十分风趣,由于它使用了ParseTrash.fillBin()的计划——不但能实验添补一个Vector,也能用它的addTrash()办法试着添补完成了Fillable(可添补)接口的任何工具。filter()必要做的全体事变就是将一个句柄前往给完成了Fillable的一个接口,然后将这个句柄作为参数传送给fillBin(),就象上面如许:
ParseTrash.fillBin("Trash.dat",bin.filler());
为发生这个句柄,我们接纳了一个“匿名外部类”(已在第7章报告)。因为基本不必要用一个已定名的类来完成Fillable,只必要属于谁人类的一个对象的句柄便可,以是这里利用匿名外部类长短常得当的。
对这个计划,要注重的一个中央是只管没有计划成对回类加以把持,但在fillBin()每次举行回类的时分,城市将一个Trash对象拔出bin。
经由过程后面那些例子的进修,DynaTrash类的年夜多半部分都应该十分熟习了。这一次,我们不再将新的Trash对象置进范例Vector的一个bin内。因为bin的范例为TypeMap,以是将渣滓(Trash)丢进渣滓筒(Bin)的时分,TypeMap的外部回类机制会当即举行得当的分类。在TypeMap里遍历并对每一个自力的Vector举行操纵,这是一件相称复杂的事变:
  1. Enumerationkeys=bin.keys();
  2. while(keys.hasMoreElements())
  3. Trash.sumValue(
  4. bin.get((Class)keys.nextElement()));
复制代码
就象人人看到的那样,新范例向体系的到场基本不会影响到这些代码,亦不会影响TypeMap中的代码。这明显是办理成绩最美满的计划。只管它的确严峻依附RTTI,但请注重散列表中的每一个键-值对都只查找一品种型。除此之外,在我们增添一种新范例的时分,不会堕入“健忘”向体系到场准确代码的为难地步,由于基本就没有甚么代码必要增加。
前些天,在CSDN上看到了一个消息,说是net网页编程网页编程AJAX成功在Linux上运行,这一点对我触动很大,而且引发了我许多感叹,所以想写出来分享一下。
深爱那片海 该用户已被删除
沙发
发表于 2015-1-21 10:29:53 | 只看该作者
是一种将安全性(Security)列为第一优先考虑的语言
活着的死人 该用户已被删除
板凳
发表于 2015-1-30 15:09:13 来自手机 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
乐观 该用户已被删除
地板
发表于 2015-2-9 20:26:27 | 只看该作者
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
只想知道 该用户已被删除
5#
 楼主| 发表于 2015-2-10 10:11:07 | 只看该作者
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
精灵巫婆 该用户已被删除
6#
发表于 2015-2-26 12:47:40 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
海妖 该用户已被删除
7#
发表于 2015-3-4 04:25:21 | 只看该作者
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
分手快乐 该用户已被删除
8#
发表于 2015-3-6 14:20:35 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
简单生活 该用户已被删除
9#
发表于 2015-3-13 02:07:15 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
透明 该用户已被删除
10#
发表于 2015-3-20 09:24:41 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
再见西城 该用户已被删除
11#
发表于 2015-3-30 00:51:11 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
小女巫 该用户已被删除
12#
发表于 2015-4-1 08:57:01 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
愤怒的大鸟 该用户已被删除
13#
发表于 2015-4-4 18:47:58 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
admin 该用户已被删除
14#
发表于 2015-4-9 22:36:25 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
因胸联盟 该用户已被删除
15#
发表于 2015-4-16 12:49:25 | 只看该作者
是一种突破用户端机器环境和CPU
16#
发表于 2015-4-18 13:13:16 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
爱飞 该用户已被删除
17#
发表于 2015-4-19 15:57:45 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
莫相离 该用户已被删除
18#
发表于 2015-4-26 23:05:21 | 只看该作者
是一种为 Internet发展的计算机语言
飘灵儿 该用户已被删除
19#
发表于 2015-4-27 22:55:12 | 只看该作者
是一种突破用户端机器环境和CPU
再现理想 该用户已被删除
20#
发表于 2015-5-1 07:10:30 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-16 02:44

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表