冒号课堂§4.4:情景范式 - 编程入门网
打扫清洁
}
“你们造人,我来造物。”冒号构造了一个餐馆的类——
// 餐馆
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在新线程中运行,不会耽误Restaurant服务下一位Customer了。” 问号眼尖:“我注意到声明customer时前面加上了关键字final,有必要吗?” “如果不用线程,是不必要的。”冒号回应道,“我们在建造线程时用到了实现Runnable接口的匿名类(anonymous class),它是涉及到局部变量customer的内部类(inner class),Java语法要求该局部变量必须是final类型。值得一提的是,这里不仅用到了并发式,而且与函数式也密切相关。” “函数式?”逗号奇道。 “不错。”冒号坚定地点着头,“我们不是提过函数式中的函数是头等公民吗?也就是说,函数与其他基本数据类型一样,可以作为传递参数、返回值或与变量名绑定。闭包(closure)便是这样一种函数,并且还能保留当初创建时周围的环境变量。以上匿名类本质上是函数serve的包装,经实例化后作为参数传入Thread的构造函数,并且记住了外部类的局部变量customer——这也是为什么它必须是final以保证不被重新赋值的原因。应该说这是一种OO化的闭包形式,预计在Java 7中它的用法会更简洁,这也意味着Java代码中将飘进更多的函数式风味。” 引号喃喃道:“以前只听说过数学里有个闭包的概念。” 冒号略加指点:“可以这么理解:所谓包,指函数与其周围的环境变量捆绑打包;所谓闭,指这些变量是封闭的,只能为该函数所专用。如果你真懂数学,就会发现它们本质上是相通的。” 叹号隐隐约约地觉得:“把函数与变量捆绑起来,怎么听起来像是OOP啊?” “嗯,的确相似。”冒号微颔,“不妨认为闭包就是封装了环境变量的隐形对象的方法——通常是匿名方法。我们用一段JavaScript代码来加深印象——”
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |