c++返回指针时候注意提防_提防Java中的函数式编程!

c++返回指针时候注意提防

这对函数式编程并不会造成太大的影响,这真棒。 这是关于某些实践的警告,您很可能会将其应用于您的代码,而这是完全错误的!

高阶函数对于函数式编程是必不可少的,因此,谈论它们将帮助您成为聚会中的关注焦点。

如果您正在编写JavaScript,那么您就一直在这样做。 例如:

setTimeout(function() {alert('10 Seconds passed');
}, 10000);

上面的setTimeout()函数是一个高阶函数。 它是一个使用匿名函数作为参数的函数。 10秒钟后,它将调用作为参数传递的函数。

我们可以编写另一个简单的高阶函数来提供上述功能:

var message = function(text) {return function() {alert(text);}
};setTimeout(message('10 Seconds passed'), 10000);

如果执行上述操作,则将执行message() ,并返回一个匿名函数,该函数将提醒您传递给message()的参数文本

在函数式编程中,以上是常见的做法。 从高阶函数返回的函数将捕获外部作用域,并在调用时能够对此作用域。

为什么在Java中这种做法很危险?

出于同样的原因。 从高阶“函数”(方法)返回的“函数”(lambda)将捕获外部作用域,并在调用时能够对该作用域起作用。

这里给出了最简单的示例:

class Test {public static void main(String[] args) {Runnable runnable = runnable();runnable.run(); // Breakpoint here}static Runnable runnable() {return () -> {System.out.println("Hello");};}
}

在上述逻辑中,如果在执行runnable.run()调用的地方放置一个断点,则可以在堆栈上看到无害的lambda实例。 一个简单的生成类,支持功能接口的实现:

无害λ实例

现在,让我们将此示例转换为您的普通Enterprise™应用程序(请注意注释 ),我们将其简化为适合此博客文章:

class Test {public static void main(String[] args) {Runnable runnable = new EnterpriseBean().runnable();runnable.run(); // Breakpoint here}
}@ImportantDeclaration
@NoMoreXML({@CoolNewValidationStuff("Annotations"),@CoolNewValidationStuff("Rock")
})
class EnterpriseBean {Object[] enterpriseStateObject = new Object[100_000_000];Runnable runnable() {return () -> {System.out.println("Hello");};}
}

断点仍在同一位置。 我们在堆栈上看到了什么?

仍然是一个无害的小lambda实例:

无害lambda-instance-2

精细。 当然。 让我们添加一些其他日志记录,仅用于调试

class Test {public static void main(String[] args) {Runnable runnable = new EnterpriseBean().runnable();runnable.run(); // Breakpoint here}
}@ImportantDeclaration
@NoMoreXML({@CoolNewValidationStuff("Annotations"),@CoolNewValidationStuff("Rock")
})
class EnterpriseBean {Object[] enterpriseStateObject = new Object[100_000_000];Runnable runnable() {return () -> {// Some harmless debugging hereSystem.out.println("Hello from: " + this);};}
}

哎呀!

突然, this引用变得“无害”,迫使Java编译器将EnterpriseBean™的封闭实例包含在返回的Runnable类中:

危险的lambda与封闭的实例

随之而来的是沉重的enterpriseStateObject ,现在不再可以对其进行垃圾收集,直到调用站点释放无害的Runnable小对象为止。

好吧,这现在不是什么新鲜事了吗?

确实不是。 Java 8没有一流的功能,没关系。 通过名义上的SAM类型支持lambda表达式的想法非常狡猾,因为它允许升级和lambda-y-fy Java生态系统中的所有现有库,而无需更改它们。

而且,在匿名课堂上,整个故事也就不足为奇了。 自从旧的Swing 1.0样式好的ActionListener等以来,以下编码样式就已经通过匿名类泄漏了内部状态。

class Test {public static void main(String[] args) {Runnable runnable = new EnterpriseBean().runnable();runnable.run();}
}@ImportantDeclaration
@NoMoreXML({@CoolNewValidationStuff("Annotations"),@CoolNewValidationStuff("Rock")
})
class EnterpriseBean {Object[] enterpriseStateObject = new Object[100_000_000];Runnable runnable() {return new Runnable() {@Overridepublic void run() {System.out.println("Hello from " + this);}};}
}

什么是新的? lambda样式将鼓励在各处使用Java中的高阶函数。 这通常是好的。 但是,只有当高阶函数是静态方法时,其结果类型才不会包含任何状态。

但是,通过上述示例,我们可以看到,在不久的将来,当我们开始接受Java 8的功能样式编程时,将通过一些内存泄漏和问题进行调试。

因此,请小心,并遵循以下规则:

(“纯”)高阶函数必须是Java中的静态方法!

进一步阅读

封闭实例之前已引起问题。 了解过去二十年来可怕的双花括号反模式如何在Java开发人员中引起痛苦和折磨。

翻译自: https://www.javacodegeeks.com/2015/11/beware-of-functional-programming-in-java.html

c++返回指针时候注意提防

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos php支持yaf,CentOS环境下给PHP7.0安装yaf扩展

|CentOS环境下给PHP7.0安装yaf扩展在CentOS环境下给PHP7.0安装yaf扩展,首先要知道PHP的安装目录在哪里,以我当前的路径为例,在/usr/local/php目录下。下一步需要下载扩展包,进入http://pecl.php.net/package/yaf寻找符合版本要求的…

linux内核编译如何选择cpu类型,Ubuntu内核编译和CPU Hot-Plug特性配置全过程及遇到问题记录...

最近编译Palacios需要linux的内核支持cpu Hot-Plug(内存热插拔)特性,无奈我机器上安装的Ubuntu10.04系统默认不支持内存热插拔特性,所以需要修改配置文件并重新编译linux内核,然后就开始了漫长的linux内核编译过程,幸好有个大神帮…

jsf教程_JSF范围教程– JSF / CDI会话范围

jsf教程会话作用域跨越多个HTTP请求-响应周期(理论上是无限的)。 当您需要每个HTTP请求-响应周期进行一次交互时,请求作用域在任何Web应用程序中都非常有用。 但是,当您需要对属于用户会话的任何HTTP请求-响应周期可见的对象时&…

linux查询设备文件信息失败怎么办,Linux下使用blkid命令查询设备及文件系统信息的方法...

在Linux下可以使用blkid命令对查询设备上所采用文件系统类型进行查询。blkid主要用来对系统的块设备(包括交换分区)所使用的文件系统类型、LABEL、UUID等信息进行查询。要使用这个命令必须安装e2fsprogs软件包。直接使用blkid可列出当前系统中所以已挂载文件系统的类型。默认情…

将MongoDB集成到您的Spring项目中

本文展示了如何通过注释配置将MongoDB集成到您的spring项目中。 我们将从Gradle配置开始。 group com.gkatzioura.spring version 1.0-SNAPSHOTbuildscript {repositories {mavenCentral()}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugi…

linux 内存一直在增加,linux – 缓存内存和共享内存总和超过总内...

所有共享内存也计为缓存.共享内存是在内部使用tmpfs实现的. tmpfs实现为页面缓存的瘦包装器,只是没有任何后备存储(除了tmpfs是可交换的).男人自由不解释这个.至少在我的系统上(由procps-ng提供,最后更新2016-06-03).抱歉.所有man free告诉你,缓存是从/ proc / meminfo中的缓存…

vertx rest 跨域_在基于简单Vertx Rest的应用程序上为REST资源设置基本响应HTTP标头...

vertx rest 跨域我是Vert.x的新手,但作为Java开发人员(辛勤工作),与NodeJS或其他任何基于Reactor的框架/库相比,我觉得它更加有趣并且很有前途。 因此,我正在使用Vert.x实现一个非常简单的Restful API。 今…

linux rpm mysql mysql_config,Linux CentOS6 mysql rpm安装

选择操作系统及版本:点击5.6版本链接将下载好的文件上传至服务器下面开始安装:检查是是否有mysql的包# rpm -qa | grep -i mysql删除原有包# yum -y remove mysql-libs*开始安装下载好的三个文件:# rpm -ivh MySQL-server-5.6.38-1.el6.x86_6…

java 可视化_可视化Java 9模块关系

java 可视化正如我在之前的文章中所述 ,我已经在Java 9 Jigsaw构建上运行Eclipse Neon了一段时间,并且没有任何问题。 我在周末花了几个小时来修改一些模块化工具的想法。 我为Eclipse Neon写了一个小插件,可视化了各个模块之间的连接。 现…

zybo的linux开发教程,Zybo全栈开发入门教程——连载三:创建Linux设备驱动和应用程序...

作者:Commanderfranz,编译: kenshin通过前面两篇文章我们不仅创建的自定义IP模块还移植了Linux操作系统,今天这篇文章的内容是将这两部分联系起来,其实我们创建的myLed IP相对于Linux操作系统可以是它的一个底层设备&a…

jwt令牌_JWT –生成和验证令牌–示例

jwt令牌JWT提供了一种非常有趣的方式来表示可以验证和信任的应用程序之间的声明。 我的目标是展示一个小的样本,它使用出色的Nimbus JOSE JWT库来生成和验证令牌。 总览 进行介绍的最佳地点之一是这里 。 简而言之,要从jwt.io网站的资料中借用&#xf…

linux 二进制差分工具,打造Android万能的软件更新库

今日科技快讯阿里星球今天在苹果商店发布的更新动态显示,其将在近期停止APP内的音乐服务,用户可以通过新版本内的指引和说明,导出本地音乐。这意味着上线八个月后,阿里星球做出了一个重大决定:停止音乐服务后&#xff…

jboss eap 7_JBoss EAP 7快速入门

jboss eap 7现在, 最新的Red Hat JBoss企业应用平台7的beta版已经发布,现在是时候探索可用的Java EE 7 快速入门并使用JBoss Developer Studio (JDBS)部署您的第一个应用程序了。 快速入门演示了JBoss EAP,Java EE 7和…

lambda 分类聚合_使用Java 8 Lambda,流和聚合

lambda 分类聚合总览 在本文中,我们将介绍使用Java 8 lambda,流和聚合来过滤和处理Collection中的对象。 这篇文章中的所有代码都可以在此处的 BitBucket中找到 。 对于此示例,我们将创建许多对象,这些对象代表我们IT基础架构中的…

linux下kegg注释软件,KEGG功能注释工具 KofamKOALA 安装与使用

KEGG数据库,即京都基因和基因组百科全书(Kyoto Encyclopedia of Genes and Genomes),是系统分析基因功能、基因组信息的数据库。KofamKOALA是一个方便的KEGG功能注释工具,由创建KEGG的京都大学化研所生物信息中心学者在2019年11月发表于Bioin…

jooq_jOOQ API设计缺陷的怪异事件

jooqjOOQ是内部特定于域的语言(DSL) ,它以Java(宿主语言)建模SQL语言(外部DSL)。 这篇热门文章描述了jOOQ API的主要机制: Java Fluent API设计器速成课程 。 任何人都可以根据该文…

linux镜像文件不要大于4g,Systemback制做大于4G的Ubuntu系统镜像

1 安装Systemback依此执行以下命令。sudo apt-get updatesudo add-apt-repository ppa:nemh/systembacksudo apt-get update && sudo apt-get install systemback unionfs-fuse安装完成:2 使用Systemback生成镜像文件输入管理员密码,打开后界面以…

黑马2016java_2016年成功的Java开发人员简介

黑马2016java2015年即将结束。 现在该总结过去一年中已完成的工作和未完成的工作。 此外,现在是预测下一个2016年的好时机。 您已经猜到这篇文章是关于2016年理想的Java开发人员的。 我想给你一个惊喜,这次我更改了预测的格​​式。 为了使预测更加客观…

红帽子linux笔试题,redhat-linux面试题

redhat-linux面试题1. 在Linux系统中,以 _文件__ 方式访问设备 。2. Linux内核引导时,从文件 /etc 中读取要加载的文件系统。3. Linux文件系统中每个文件用_节点__来标识。4. 链接分…

lambda设计模式_使用lambda的装饰器设计模式

lambda设计模式随着Java中lambda的出现,我们现在有了一个新工具,可以更好地设计我们的代码。 当然,第一步是使用流,方法引用和Java 8中引入的其他简洁功能。 展望未来,我认为下一步是重新访问完善的设计模式&#xff…