java支持闭包_JAVA 需要引入闭包吗
最近有很多人 呼吁 要在JAVA的新版本中引入闭包。
那么JAVA 或者说 OOPL (面向对象编程语言)需要引入闭包吗,有了对象还需要闭包吗?
收先先了解一下什么是闭包,
闭包是可以包含自由(未绑定)变量 的代码块;这些变量不是在这个代码块或者任何全局上下文中定义的,而是在定义代码块的环境中定义。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量的存在,相关变量引用没有释放)和为自由变量提供绑定的计算环境(作用域)。
可能上面的定义有点晦涩,下面看一下《Python 核心编程》 对 闭包 的解释。
如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被定义为闭包。定义在外部函数内的但由内部函数引用或者使用的变量被称为自由变量 。
下面是一个闭包的例子(由于JAVA现在不支持闭包,这个闭包的例子是用Python写的,参见了《Python 核心编程》 )
def counter(start_at =0):
count=[start_at]defincr():
count[0]+= 1
returncount[0]return incr
这里面count变量 就是一个 相对于函数incr 的自由变量(它在 函数incr 的外部作用域上,但又不在全局作用域上),内部函数incr 可以引用和使用这个变量。这个例子主要模拟一个计数器。
运行下面的代码
count = counter(6)
print count()
print count()
就会打印出
7
8
我们发现 内部函数(incr)不但可以引用其自身定义的变量,还可以引用外部函数(counter)定义的变量。
或者说 内部函数(闭包) 可以记忆状态, 它可以根据 它记忆的状态 来执行不同的操作。 而外部函数 负责
初始化状态(内部函数需要记忆的状态)。
那么为什么需要闭包,闭包的优势是什么呢?
我觉得就是可以记忆状态
但对象也可以记忆状态(通过对象的属性)。
那闭包和对象的区别是什么呢?
我觉得 就因为 闭包是函数 而不是对象。
我们会发现,如果用面向对象的方式来表达闭包
内部函数(闭包)就像 对象的方法
而外部函数 对象的构造器。
构造器 用来 初始化对象状态
而 对象的方法可以根据 对象的状态 来执行不同的操作。
好! 下面我们用面向对象的方式 创建一个 计数器(实现和上例一样的功能,用JAVA实现)。
public classCounter {private intstartAt;publicCounter() {this(0);
}public Counter(intstartAt) {this.startAt =startAt;
}public intincr(){return ++ this.startAt;
}
}
运行Test类
public classTest{public static voidmain(String[] args){
Counter counter= new Counter(6);
System.out.println(counter.incr());
System.out.println(counter.incr());
}
}
会打印出(和上例打印输出相同)
7
8
那么JAVA(有了对象)还需要引入闭包吗?
我觉得不需要,
因为对象完全可以模拟 闭包 的行为,
而且 对象 才是 OOP 的 一级元素。
闭包 是 函数式编程(FP) 中的 概念,
引入闭包 就相当于 引入 FP,
这只会破坏 JAVA 的 纯粹 与 简单 。。
-------------------------------------
后记
闭包本质上是一个可以作为函数调用的参数的代码块。
闭包与C语言的指针、Java的匿名内部类的区别:
闭包可以引用它们定义时可见的变量。Java内部类可以只能引用常量,闭包可以引用一些可见的局部变量。
闭包的关键是:它是个代码块加上对它来自的环境的绑定。
java支持闭包_JAVA 需要引入闭包吗相关推荐
- java支持泛型_Java自学-泛型 支持泛型的类
Java 如何设计支持泛型的类 步骤 1 : 不支持泛型的Stack 以Stack栈为例子,如果不使用泛型 当需要一个只能放Hero的栈的时候,就需要设计一个HeroStack 当需要一个只能放Ite ...
- java第三方包_java客户端引入第三方包方法
将java作为客户端运行(即通过java -jar client.jar方式运行),如有引用第三方jar包,不作特殊处理是无法正确运行,会抛出ClassNotFoundException异常. 如以下 ...
- java支持库(_Java运行环境支持库下载-Java Runtime Environment(JRE) v9.1.8官方64位版-ucbug下载站...
JRE为Java Runtime Environment的简称,运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库.Java Runtime Environment(包括Java ...
- java 匿名函数_Java 理论与实践,闭包之争
Java 语言是否应增加闭包以及如何添加? 在跨越边界 系列最近的一篇文章中,我的朋友兼同事 Bruce Tate 以 Ruby 为例描述了闭包的强大功能.最近在安特卫普召开的 JavaPolis 会 ...
- java中是否支持多重继承_java支持多重继承吗 JAVA特性面试题:
1.简要介绍java程序的健壮性. 答:JAVA程序会在编译和运行的时候自动的检测可能出现的错误,而且它是一种强类型语言,对于类型的检查很严格,而且它的垃圾回收机制也有效的避免了内存的泄漏. 2.为什 ...
- java支持库 易语言_Java支持库|简易语言源网络|易语言资源网| e5a5x
Java支持库 支持库名称: Java支持库2.0版 相关文件: C: \ ProgramFiles(x86)\ e \ lib \ Javalib.fne 数字签名: F3DA9F65E55F47c ...
- java 支持的编码格式_Java支持的编码格式(各个国家的语言)
Java支持的编码格式(各个国家的语言) (2010-04-13 17:23:29) 标签: java 编码 it JDK提供了一个将中文转换为Unicode编码格式 转换器 说明 --------- ...
- 【Groovy】闭包 Closure ( 闭包类 Closure 简介 | 闭包 parameterTypes 和 maximumNumberOfParameters 成员用法 )
文章目录 一.闭包类 Closure 简介 二. 闭包 parameterTypes 和 maximumNumberOfParameters 成员用法 三. 完整代码示例 一.闭包类 Closure ...
- javascript闭包_JavaScript闭包教程–带有JS闭包示例代码
javascript闭包 Closures – many of you JavaScript devs have probably heard this term before. When I sta ...
最新文章
- 到「黄埔学院」去:打造AI首席架构师,第二期限量招募!
- DRF工程搭建、环境安装与配置
- 网易笔试题——计算机视觉_深度学习方向
- Struts2之类型转换
- JAVA通过反射获取方法真实参数名
- 【小贴士】虚拟键盘与fixed带给移动端的痛!
- 有人说是金山造了熊猫烧香病毒
- java enum转ini_JAVA中用XML实现INI文件格式的解决方
- 重构:改善既有代码的设计 精彩书评二
- subprocess模块(了解)
- android内核调试的步骤
- 剑指_6从尾到头打印链表(Python)
- Java Excel 导出为 PDF
- 熟识 : 计算机文化(收藏)
- 瀑布流插件WookMark
- hibernate hbb.xml 映射关系
- 阿里云搭建大数据平台(9):kafka安装部署和测试
- 6.OSI七层模型及交换机工作原理及VLAN(虚拟局域网)及VTP(vlan同步技术)
- 3、哈哈哈-(2)hahaha1.py
- 计算机丢s7aregsx.dll,打开STEP7 显示:S7aregsx.dll 文件丢失-工业支持中心-西门子中国...
热门文章
- leancloud上传php源码部署,部署灵动云商到LeanCloud[图解]
- java过滤器解决乱码_[java]如何使用过滤器解决jsp乱码
- rtsp连接断开_live555_RTSP连接建立以及请求消息处理过程
- ftp linux 服务器 麒麟_阿里云ECS服务器搭建vsftpd
- python必须连网开发吗_Python以太坊开发节点和网络选择
- java 求向量的均值,标准数组——向量
- java 字符串截取_java截取字符串,截串,substring和split,分割字母和数字,正则缝隙...
- 基于JAVA+SpringBoot+Mybatis+MYSQL的仿天猫商城
- window.location.href重定向 不会触发webview
- POJ1734无向图求最小环