最近有很多人 呼吁 要在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 需要引入闭包吗相关推荐

  1. java支持泛型_Java自学-泛型 支持泛型的类

    Java 如何设计支持泛型的类 步骤 1 : 不支持泛型的Stack 以Stack栈为例子,如果不使用泛型 当需要一个只能放Hero的栈的时候,就需要设计一个HeroStack 当需要一个只能放Ite ...

  2. java第三方包_java客户端引入第三方包方法

    将java作为客户端运行(即通过java -jar client.jar方式运行),如有引用第三方jar包,不作特殊处理是无法正确运行,会抛出ClassNotFoundException异常. 如以下 ...

  3. java支持库(_Java运行环境支持库下载-Java Runtime Environment(JRE) v9.1.8官方64位版-ucbug下载站...

    JRE为Java Runtime Environment的简称,运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库.Java Runtime Environment(包括Java ...

  4. java 匿名函数_Java 理论与实践,闭包之争

    Java 语言是否应增加闭包以及如何添加? 在跨越边界 系列最近的一篇文章中,我的朋友兼同事 Bruce Tate 以 Ruby 为例描述了闭包的强大功能.最近在安特卫普召开的 JavaPolis 会 ...

  5. java中是否支持多重继承_java支持多重继承吗 JAVA特性面试题:

    1.简要介绍java程序的健壮性. 答:JAVA程序会在编译和运行的时候自动的检测可能出现的错误,而且它是一种强类型语言,对于类型的检查很严格,而且它的垃圾回收机制也有效的避免了内存的泄漏. 2.为什 ...

  6. java支持库 易语言_Java支持库|简易语言源网络|易语言资源网| e5a5x

    Java支持库 支持库名称: Java支持库2.0版 相关文件: C: \ ProgramFiles(x86)\ e \ lib \ Javalib.fne 数字签名: F3DA9F65E55F47c ...

  7. java 支持的编码格式_Java支持的编码格式(各个国家的语言)

    Java支持的编码格式(各个国家的语言) (2010-04-13 17:23:29) 标签: java 编码 it JDK提供了一个将中文转换为Unicode编码格式 转换器 说明 --------- ...

  8. 【Groovy】闭包 Closure ( 闭包类 Closure 简介 | 闭包 parameterTypes 和 maximumNumberOfParameters 成员用法 )

    文章目录 一.闭包类 Closure 简介 二. 闭包 parameterTypes 和 maximumNumberOfParameters 成员用法 三. 完整代码示例 一.闭包类 Closure ...

  9. javascript闭包_JavaScript闭包教程–带有JS闭包示例代码

    javascript闭包 Closures – many of you JavaScript devs have probably heard this term before. When I sta ...

最新文章

  1. 网闸与防火墙的区别是什么
  2. 核磁共振影像数据处理-1(下)-DWI基础、Li‘s have a solution and plan.
  3. 工作五年,后面四年重复着第一年的活儿?
  4. Elasticsearch-06 Spring Boot 2.0.9整合ElasticSearch5.6.16
  5. redis面试问题(一)
  6. rabbitmq接口异常函数方法_RabbitMQ监控(三):监控队列状态
  7. 安阳师范学院计算机与信息工程学院吴琴霞,基于甲骨文字形动态描述库的甲骨文输入方法...
  8. 向一个数组中插入元素
  9. python中iter函数_Python iter()函数用法详解
  10. 95-280-046-源码-资源管理-磁盘
  11. CALayer 简单的使用
  12. shell 免杀aspx_对于asp免杀webshell的一些总结
  13. spring jdbc_Spring JDBC示例
  14. delphi 读写文本文件
  15. spring AOP 代理(静态与动态+使用cglib实现)
  16. 交通流分析1:《基于大数据的城市公路交通流短时预测研究_张红》阅读总结
  17. 如何键盘锁定计算机,怎么锁键盘-键盘上的小秘密你真知道吗?
  18. 选择小程序的8大理由,让你拒绝说No
  19. 碳中和目标下A股先锋调研:钢铁行业加速碳达峰 多行业影响已现
  20. session 修改密码python_django修改密码强制退出机制

热门文章

  1. 百度搜索关键字抓取_怎么使百度竞价的效益最大化
  2. php 检测密码,php 判断密码是否简单
  3. 求两个数的公约数java_java中怎样求两个数的最大公约数?
  4. delphi 文字 动画 特效 控件_设计师的特效让程序员追砍3条街,220集AE软件教学视频,教他做人...
  5. datatables ajax错误,ajax datatable - DataTables警告:table id = example - 无法重新初始化DataTable(示例代码)...
  6. java和c 对接_java和objective-C对接笔记
  7. Java 基础系列:不变性
  8. 作用域、变量提升、函数提升、数据类型
  9. 基于JAVA的IKAnalyzer中文分词运用
  10. Android轮播图