jacklondon的专栏

jacklondon的专栏

用户操作
[即时聊天] [发私信] [加为好友]
jacklondon ChenID:jacklondon
48145次访问,排名2277好友4人,关注者9
从事技术工作超过十年的老妖精。
开源 J2EE 框架 VelocityWeb 的发起人。
如来佛的兄弟。
http://blog.csdn.net/jacklondon
http://velocityweb.sourceforge.net
http://jacklondon.javaeye.com
jacklondon的文章
原创 37 篇
翻译 0 篇
转载 1 篇
评论 192 篇
jacklondon的公告
从事技术工作超过十年的老妖精。 开源 J2EE 框架 VelocityWeb 的发起人。 如来佛的兄弟。 http://blog.csdn.net/jacklondon http://velocityweb.sourceforge.net http://jacklondon.javaeye.com
最近评论
smartcarnew:异常处理确实是一个需要深思的问题,不过在C++中重要的是要明确的规范和处理,异常对于错误处理情况已经有了很多好处,而对于例子中说的资源泄漏情况已经有了成熟的程序设计方式来处理,比如用类或一些智能指针来管理。
friendShingle:说句公道话,我感觉这个分析比较客观,至少人家以数据说话。 不过楼主没有分析 compiler 在 1.5 突然增加的原因,我估计是因为加入了范型编程。从03年到现在我从事了多年的Swing开发,感觉Swing的Bug很多,特别是 1.4 有时我都很恼火,不过基于不影响使用,而且在Windows下Bug很少,在其它平台中Bug多一些。在03年以前我做过三年的Delpi/VC等的开发,我感觉Sw……
killme2008:无话可说,比较汗
killme2008:无话可说,比较汗
jacklondon:to gtlang78,
你说的也有道理。我正在写另外一篇文章,分析 JDK 各个部分的 bug rate(不知道中文应该怎么翻译,实际意思是每千行纯代码中包含的 bug 数量)。这样比较就更有意义了。
我个人的看法,JDK 的 GUI 代码质量不可能会很好。整个 JDK 中,Sun 与别人合作开发的好像只有 Swing。在 Swing 之前,Sun 独立开发的 AWT……
文章分类
收藏
    相册
    文章图片
    软件技术大全
    codeproject
    sourceforge
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Java JDBC 实现反思收藏

    新一篇: 打算写一个文章对 Sun JDK 的 bug 进行分析 | 旧一篇: 近日在 sourceforge 上发布一个 java Framework

    在 Java 中,因为 JDBC 很多函数都抛出 SQLException,程序员用 JDBC 不得不写很多 try catch finally 之类的代码,这一点已经是众所周知的问题。众多的 O/R mapping 或者 JDBC 封装工具类,在吹自己的好处的时候,都不忘了和 JDBC 比较一把,“用我就不用写这么多乱七八糟的 try catch”。问题在于,既然 JDBC 设计的有这么多人觉得不好,为什么没有人去建议 Sun 公司改进一吧?这是一个非常让人迷惑的事情。

      这里面暴露了 Java 中两个问题: Exception 语法问题、interface 语法问题。

      Exception 应不应该用,在 C++ 时代就有很多争论,在目前的大多数比较有名气的开源项目中,要么,只用 C 不用 C++,要么用 C++ 但不用 Exception,用 C++ Exception 的很少。这里面的原因在于,在 C++ 中 throw Exception,会破坏结构化程序设计的一个最基本原则:一个函数只有一个入口,一个出口。在其他语言中,一个函数有多个出口也许没有什么问题,最多只是代码的可读性、维护性不好,在 C++ 中,一个致命的问题,资源释放问题,强烈要求,函数只能有一个出口。

      比如如下代码:

    funA(){
      A *a = new A();
      funT(a);
      delete a;
    }

      这样的代码,如果一开始,funT 中没有 throw Exception,这样的代码没有自然释放问题;如果某一天,有人将 funT 中增加这么一段代码:

    funT(A *a){
      ....
      if(xx){
        throw exception;
      }
      ....
    }

      则以上函数 funA 中,就存在内存泄漏问题:如果funT 运行到 throw exception,funA 中 delete 根本就不会执行到。如果 funA 归程序员 jack 负责, funT 归 tom 负责,jack 只看 funA 也许永远也不会意识到 funA 有内存泄漏问题。

      在 Java 中,虽然不存在内存泄漏问题,但是存在资源释放关闭问题,比如关闭文件之类的。像 Spring、Hibernate 之类的工具包,将 SQLException 封装成 RuntimeException ,同样让人迷惑。

      比如以下 Java 伪代码:

    open file;
    read file;
    dao.saveFileData();  // throw exception inside
    close file;

      如果 saveFileData 抛异常的话, close file 根本执行不到。按照目前流行的方法, DAO 函数抛异常都是 RuntimeException,编译器不会提醒你去 try catch,这里面出错的可能性大大提高。
      目前已经有人在呼吁,Java coding 中也不要用 exception。

      另一个问题是 Java 中 interface 语法问题。
      Java 中 interface 语法非常糟糕,JDK 任何一个 interface 一旦发布后,做任何修改(增加函数、修改函数、去掉函数),都会导致已有的程序员代码,使用新的 JDK 编译不能通过问题。
      比如,JDK 中有一个 interface 叫 Serializable, 这是一个空的 interface(非常莫名其妙的设计),假定某天 Sun 决定给这个 interface 需要增加 readObject,writeObject , 这就有问题了。很多已经写了这样的代码:

    public class M implements Serializable{
      ....
    }

      如果新的 JDK 中,Serializable 多了两个函数,用新的 JDK 去编译已有的代码 class M,就会编译不通过。这实际上将 Sun 放在一个非常尴尬的处境:你可以在新的 JDK 中往 class 中增加函数,比如  Sun 可以在 JDK 1.3 省级到 1.4 的时候,往 String 类中增加一个函数 replaceAll,但是 Sun 不能改动任何 interface。不能升级 JDK 中的 interface 意味着,Sun 在 JDK 1.0 中发布的 interface ,在 JDK 1.4 中要原封不动,在以后的版本中也要永远不动。这个要求太高了!!!

      为什么 Sun 写不出一个象 ADO 一样的 JDBC,不用抛 Exception 的 JDBC 规范出来?

    发表于 @ 2006年08月03日 19:08:00|评论(loading...)|编辑

    新一篇: 打算写一个文章对 Sun JDK 的 bug 进行分析 | 旧一篇: 近日在 sourceforge 上发布一个 java Framework

    评论

    #killme2008 发表于2007-01-16 18:03:14  IP: 211.138.140.*
    无话可说,比较汗
    #killme2008 发表于2007-01-16 18:28:57  IP: 220.162.145.*
    无话可说,比较汗
    #smartcarnew 发表于2008-06-23 14:56:40  IP: 202.165.107.*
    异常处理确实是一个需要深思的问题,不过在C++中重要的是要明确的规范和处理,异常对于错误处理情况已经有了很多好处,而对于例子中说的资源泄漏情况已经有了成熟的程序设计方式来处理,比如用类或一些智能指针来管理。
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © jacklondon