快速业务通道

冒号课堂§4.4:情景范式 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
打扫清洁 } “你们造人,我来造物。”冒号构造了一个餐馆的类—— // 餐馆 Class Restaurant { // 每当有顾客来访,返回该顾客 private Customer accept() {…} // 为指定顾客提供所有的餐馆服务 private void serve(Customer customer) {…} // 餐馆服务 public void service() {     while (true) // 无限循环,假设餐馆7×24小时营业     {         final Customer customer;         if ((customer = accept() ) != null) // 某顾客来访         {             serve(customer);// 为该顾客提供服务 } } } }

冒号课堂§4.4:情景范式(3)

时间:2011-06-27 BlogJava xyz98

冒号解说道:“这里accept类似Socket的accept,属于堵塞呼叫,意味着此方法将堵塞进程直至收到新数据。为简单计,把一行顾客当作一个Customer。大家对此段代码有何看法?”

“没什么,很简单啊。”逗号说完补充一句,“关键是serve方法的实现。”

“这里我们明显用到了两个范式,对象式和过程式。”冒号提示道。

引号会意:“应该还需要并发式。serve如果与service在同一线程中运行,那么餐馆只有等服务完一个Customer后才能服务后面的,这显然是荒唐的。”

“对极了!”冒号将“serve(customer);”改写为——

// serve(customer); // 错误地使用单线程! new Thread       // 构造一个线程 (new Runnable() {      public void run(){ Restaurant.this.serve(customer); } }).start();     // 启动该线程

冒号道:“这回serve在新线程中运行,不会耽误Restaurant服务下一位Customer了。”

问号眼尖:“我注意到声明customer时前面加上了关键字final,有必要吗?”

“如果不用线程,是不必要的。”冒号回应道,“我们在建造线程时用到了实现Runnable接口的匿名类(anonymous class),它是涉及到局部变量customer的内部类(inner class),Java语法要求该局部变量必须是final类型。值得一提的是,这里不仅用到了并发式,而且与函数式也密切相关。”

“函数式?”逗号奇道。

“不错。”冒号坚定地点着头,“我们不是提过函数式中的函数是头等公民吗?也就是说,函数与其他基本数据类型一样,可以作为传递参数、返回值或与变量名绑定。闭包(closure)便是这样一种函数,并且还能保留当初创建时周围的环境变量。以上匿名类本质上是函数serve的包装,经实例化后作为参数传入Thread的构造函数,并且记住了外部类的局部变量customer——这也是为什么它必须是final以保证不被重新赋值的原因。应该说这是一种OO化的闭包形式,预计在Java 7中它的用法会更简洁,这也意味着Java代码中将飘进更多的函数式风味。”

引号喃喃道:“以前只听说过数学里有个闭包的概念。”

冒号略加指点:“可以这么理解:所谓包,指函数与其周围的环境变量捆绑打包;所谓闭,指这些变量是封闭的,只能为该函数所专用。如果你真懂数学,就会发现它们本质上是相通的。”

叹号隐隐约约地觉得:“把函数与变量捆绑起来,怎么听起来像是OOP啊?”

“嗯,的确相似。”冒号微颔,“不妨认为闭包就是封装了环境变量的隐形对象的方法——通常是匿名方法。我们用一段JavaScript代码来加深印象——”

/* 返回函数f的近似导函数 */ function derivative(f) { // dx最好作为参数传入,放在此处主要是为了说明闭包的用法     var dx =

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号