大飞的网上家园

打好基础,练好内功,关注新技术

逝者如斯


Me— 一位朋友说这张有西北的味道,哈哈。
网志分类
· 所有网志
· FreeBSD/unix/linux相关
· PostgreSQL/数据库相关
· RubyOnRails/Web开发
· 分布式/网络/服务器技术
· 语言(c++,java,php,ruby...)
· 基本功(算法,os,编译器...)
· 好文共赏
· 生活轨迹
· 好用的免费软件
· 未分类
搜索本站
友情链接
· 我们的小歪
· 管理我的Blog
· -----------朋友----------
· Butterfly的童话世界
· crazyxu的窝
· 张佳的blog
· 动态感觉 静观其变
· 饱饱的心
· 刘鹏
· ----------技术----------
· FreeBSD 中文计划
· FreeBSD China
· PostgreSQL中国
· PostgreSQL的官方站点
· postgresql 的sourceforge
· ruby cn
· ruby 中文网
· source
· xampp
· rubyonrails
· The Magic DIrk
· KeKe's Blog(JavaScript)
· 褪色的海
· cmap
· 中文zope组
· zope
· Todo List (rememberthemilk)
· Todo List (vo2do)
· Blinklist social bookmarking
· 中文FreeBSD用户组
· plone
· Nio’s Weblog(Ajax)
· Ajax Magazine
· good rails blog
· ajaxscaffold
· --------其他--------
· 老徐的blog

订阅 RSS

0020650

歪酷博客


« 上一篇: Environment error: "JAVA_HOME" should not be defined. 错误解决方法 下一篇: Fortune 的七条管理新理念 »
大飞 @ 2006-07-05 18:48

最近在讲设计模式,讲完Template method后,留下一道作业,使用Template method 模式来实现冒泡排序,分别实现int,double,String行的排序,
今天看了很多使用Template method实现BubbleSort的代码,有些实现的比较好,
有些虽然体现了Template method,但是仔细推敲,存在类型安全问题。

例如:

存在以下代码:

public void Sort(Object obj[]){

      ….

}

protected abstract  boolean Compare(Object first,Object second);

子类中的实现:

protected boolean Compare(Object first, Object second) {
     double one=Double.parseDouble(first.toString());
     double two=Double.parseDouble(second.toString());
     return one > two;
 }

测试代码如下:

  Object[] myArray={-7.0,2.35,5.4,4.2};
  BubbleSorter  sorter= new DoubleBubbleSorter();
  sorter.sort(myArray);

这段代码可以运行,但是存在安全隐患。

假如 客户这样使用:

  Object[] myArray={”a”,”bde”,”b”,”e”};
  BubbleSorter  sorter= new DoubleBubbleSorter();
  sorter.sort(myArray);

编译是可以通过的。但是执行的时候就会出现异常.

最好能在编译期就发现这类错误,而不是运行期。

其实java是强类型语言,Java 的安全和健壮性部分来自于它是该类型语言这一事实。首先,每个变量有类型,每个表达式有类型,而且每种类型是严格定义的。其次,所有的数值传递,不管是直接的还是通过方法调用经由参数传过去的都要先进行类型相容性的检查。Java 编译器对所有的表达式和参数都要进行类型相容性的检查以保证类型是兼容的。任何类型的不匹配都是错误的,在编译器完成编译以前,错误必须被改正。通过类型相容性的检查,java将帮助你减少程序出错的可能性。但是如果将类型声明为Object时,由于java单根继承于Object,也就是说所有类型都和Objcet类型兼容。这样做有时的确很灵活,但付出的代价却是存在类型安全问题,这样做等于把java 从强类型语言变成了弱类型语言,这样的程序,在使用的时候是比较危险的。

java 1.5出现的泛型技术更加加强了java的类型安全检查,特别对于java容器类更是如此。

强类型可以使代码更加安全健壮,但同时也降低了灵活性。但是安全性健壮性并不和灵活性总是矛盾,通过使用泛行技术能在一定程度上缓解这个矛盾。不过,一般来说,应尽可能的少用Object定义类型,毕竟有些时候没有了安全性/健壮性,灵活性也失去了意义。

以上是个人观点,也许有偏颇之处,欢迎指正。




最新评论


asyura

2006-07-20 22:02

既然是排序,还用Object作为参数类型的话,效率岂不是降了很多。而且这样写Java程序、类型乱用的人不多吧?呵呵,你最近在忙啥呢,好久没联系啦,过来看望一下:)



dafei

2006-07-24 08:54

哈哈。效率降低是一方面,关键是类型严重不安全,哈哈,最近还是忙着工作,学习。


评论 / 个人网页 / 扔小纸条
* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 


 

分类小组论坛
杂谈 , 娱乐、八卦 , 文学、艺术 , 体育 , 旅游、同城 , 象牙塔 , 情感 , 时尚、生活 , 星座 , 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定