闭包又称词法闭包

闭包最早定义为一种包含<环境成分>和<控制成分>的实体.

解释一:闭包是引用了自由变量的函数,这个被引用的变量将和这个函数一同存在。

解释二:闭包是函数和相关引用环境组成的实体。

注:<自由变量>:除了局部变量的其他变量

简单理解:闭包能够将一个方法作为一个变量去存储,这个方法有能力去访问所在类的自由变量。

Java中闭包实现

关键点:

如何用变量去存储方法?

java中能够保存方法的变量指的就是普通的对象

如何让这个普通对象能够访问所在类的自由变量?

纯天然的解决办法是:内部类。内部类能够访问外部类的所有属性及方法。

隐藏具体实现是内部类的作用之一,如何保证隐藏具体实现的同时还能将闭包传递到外部使用?

让内部类实现通用接口,然后将内部类对象向上转型为接口类型。

上述解决办法就是Java最常用的闭包实现办法(内部类+接口)

下面提供一个简单的实现

public class Milk {

	public final static String name = "纯牛奶";//名称

	private static int num = 16;//数量

	public Milk()
{
System.out.println(name+":16/每箱");
} /**
* 闭包
* @return 返回一个喝牛奶的动作
*/
public Active HaveMeals()
{
return new Active()
{
public void drink()
{
if(num == 0)
{
System.out.println("木有了,都被你丫喝完了.");
return;
}
num--;
System.out.println("喝掉一瓶牛奶");
}
};
} /**
* 获取剩余数量
*/
public void currentNum()
{
System.out.println(name+"剩余:"+num);
}
} /**
* 通用接口
*/
interface Active
{
void drink();
}

使用上述实现

public class Person {

	public static void main(String[] args) {
//买一箱牛奶
Milk m = new Milk(); Active haveMeals = m.HaveMeals(); //没事喝一瓶
haveMeals.drink();
//有事喝一瓶
haveMeals.drink(); //看看还剩多少?
m.currentNum();
} }

运行结果

纯牛奶:16/每箱
喝掉一瓶牛奶
喝掉一瓶牛奶
纯牛奶剩余:14

上述例子中,通过调用Active的方法实现对Milk私有变量num进行修改。

有时候觉得直接使用set方法也可以直接修改private变量,但是从现实生活中来说让人去执行喝牛奶的动作比牛奶自己动手喝来的合理一些。

总结

1.实际项目中没怎么用过闭包,因此不能对他的好坏进行评论。

2.建议合理的使用闭包,不完全不使用,也不能滥用。

3.特别注意:闭包会导致资源不被回收,如上例,在main方法中将m设为null,使用haveMeals继续调用drink方法仍然会喝掉一瓶牛奶,说明Milk对象并没有被释放掉。

最新文章

  1. 转 jQuery 中bind(),live(),delegate(),on() 区别
  2. h5 hdf5 文件转 tif 流程
  3. lucene中FSDirectory、RAMDirectory的用法
  4. Android Sqlite 工具类封装
  5. laravel Ajax post方式的使用
  6. JS面向对象组件(一) ---包装对象与原型链
  7. 全新ASP框架——IISNODE介绍
  8. UICollectionView设置item(cell)之间间距为0(紧挨在一起的效果)
  9. wireshark 过滤条件汇总
  10. Oracle数据块损坏的恢复实例
  11. python--DenyHttp项目(2)--ACM监考服务器端
  12. 让MessageBox对话框总在最前面
  13. js 判断通过什么打开(安卓、苹果、微信、QQ、浏览器、某个app应用…)
  14. du和df显示磁盘空间使用差异大的几种情况
  15. python 堆排序
  16. javaScript(4)---数据类型
  17. 其他综合-使用Xshell远程连接管理Linux实践
  18. Python 游戏之旅(Pygame)
  19. zookeeper核心-zab协议-《每日五分钟搞定大数据》
  20. 第十六节,卷积神经网络之AlexNet网络实现(六)

热门文章

  1. 如何基于 echarts 在柱状图或条形图上实现转换率?(有想法吗?)
  2. ThreadLocal Thread ThreadLocalMap 之间的关系
  3. 【asp.net core 系列】3 视图以及视图与控制器
  4. java方法句柄-----4.你所不知道的MethodHandle【翻译】
  5. Java实现蓝桥杯模拟带九9的数的个数
  6. Java实现蓝桥杯单位转换
  7. 本地存储 localStorage
  8. 【JAVA习题二十九】809*??=8*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。
  9. mysql安装过程以及遇到问题的解决方法
  10. SpringCloud之Security