快速业务通道

浅谈Java 7的闭包与Lambda表达式之优劣 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
w new AException(ex);    } }

当我们写一个方法A去调用方法B时,我们要么在方法A中使用try...catch捕获B抛出的方法,要么在方 法A的签名中标记“会抛出同样的异常”。如上面的myMethodCaller方法,便在内部处理了BException异 常,而只会对外抛出AException。Java便使用这种方法严格限制了类库的异常信息。

Checked Exception是一个有争议的特性。它对于编写出高质量的代码非常重要,因为在哪些情况抛出 异常其实都是方法契约的一部分(不仅仅是签名或返回值的问题),应该严格遵守,在类库升级时也不能 破坏,否则便会产生兼容性的问题。例如,您关注MSDN里的文档时,就会看到异常的描述信息,只不过这 是靠“文档”记录的,而Java则是强制在代码中的;但是,从另一个角度说,Checked Exception让代码 编写变得非常麻烦,这导致的一个情况便是许多人在写代码时,自定义的异常全都是RuntimeException( 因为不需要标记),每个方法也都是throws Exception的(这样代码中就不需要try...catch了),此时 Checked Exception特性也基本形同虚设,除了造成麻烦以外几乎没有带来任何好处。

我之前常说:一个特性如果要被人广泛接受,那它一定要足够好用。现在如Scala和Grovvy等为Java设 计的语言中都放弃了Checked Exception,这也算是从侧面印证了Checked Exception的尴尬境地吧。

而Checked Exception对于如今Lambda或闭包来说,在我看来更像是一种硬伤。为什么这么说?举个例 子吧,假如有这么一个map方法,可以把一个数组映射成另一个类型数组:

public R[] map(T[] array, Func<T, R> mapper) { ... }

好,那么比如这样一个需求:给定一个字符串数组,保存着文件名,要求获得它的标准路径。从表面 上看来,我们可以这样写:

map(files, #(String f)(new File(f).getCanonicalPath())

浅谈Java 7的闭包与Lambda表达式之优劣(4)

时间:2011-10-02 老赵

但事实上,这么做无法编译通过。为什么?因为getCanonicalPath方法会抛出IOException,我们在调 用时必须显式地使用 try...catch进行处理。那么这段代码该怎么写?还真没法写。如果没有Checked Exception的话(如C#),我们还可以这么做(处理第一个抛出的IOException):

try {    map(files, #(String f)(new File(f).getCanonicalPath()) catch (IOException ex) {    ...  }

但是,如果我们要写出之前那种“漂亮”的写法,就不能使用Func<T, R>而必须是这样的接口 类型:

public interface FuncThrowsIOException<T, R> {    R invoke(T arg) throws IOException; }

或者是这样的“匿名函数类型”:

#String(String)(throws IOException) // toCanonicalPath = #(String f)(new  File(f).getCanonicalPath())

但是,作为Lambda和闭包的常用场景,如map,filter,fold等“函数式”元素,是不可能为某种特定 的“异常类型”而设计的——异常类型千变万化,难道这也要用throws Exception来进行“统一处理”吗 ?Java虽然已经支持对异常类型的“推断”,但Checked Exception还是对Lambda和闭包的适用性造成了 很大影响。

因此,我认为Checked Exception是一个“硬伤”。

其他

Java的Lambda和闭包还有一些特性,例如参数的“泛化”:

#boolean(Integer) f = #(Number n)(n.intValue() > 0);

由于Number是Integer的基类,因此我们可以使用Number来构造一个接受Integer参数的匿名函数类型 。由于示例较少,我还不清楚这个特性的具体使用场景和意义所在——不过

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号