java自动生成合同_Java 7和Java 8之间的细微自动关闭合同更改

java自动生成合同

Java 7的try-with-resources语句和与该语句一起使用的AutoCloseable类型的一个不错的功能是,静态代码分析工具可以检测到资源泄漏。 例如,Eclipse:

资源泄漏

当您具有上述配置并尝试运行以下程序时,您将收到三个警告:

public static void main(String[] args) 
throws Exception {Connection c = DriverManager.getConnection("jdbc:h2:~/test", "sa", "");Statement s = c.createStatement();ResultSet r = s.executeQuery("SELECT 1 + 1");r.next();System.out.println(r.getInt(1));
}

输出是琐碎的

2

警告在所有csr上发出。 一种快速的解决方法(不要这样做!)是使用Eclipse特定的SuppressWarnings参数抑制警告:

@SuppressWarnings("resource")
public static void main(String[] args) 
throws Exception {...
}

毕竟,WeKnowWhatWeReDoing™,这只是一个简单的示例,对吧?

错误!

即使对于简单的示例(至少在Java 7之后),解决此问题的正确方法是使用轻松的try-with-resources语句。

public static void main(String[] args) 
throws Exception {try (Connection c = DriverManager.getConnection("jdbc:h2:~/test", "sa", "");Statement s = c.createStatement();ResultSet r = s.executeQuery("SELECT 1 + 1")) {r.next();System.out.println(r.getInt(1));}
}

实际上,如果Eclipse可以自动修复此警告并将所有单独的语句包装在try-with-resources语句中,那就太好了。 请支持此功能请求!

Java 8处理了什么?

在Java 8中, AutoCloseable上的约定已经非常微妙地更改(或直率地更改了,具体取决于您的观点)。

Java 7版本

当不再需要时必须关闭的资源。

注意单词"must"

Java 8版本

在关闭之前可以保存资源(例如文件或套接字句柄)的对象。 当退出在资源规范头中已声明该对象的try-with-resources块时,将自动调用AutoCloseable对象的close()方法。 这种构造可确保及时释放,避免资源耗尽异常和可能发生的错误。

API注意:

即使不是所有的子类或实例都拥有可释放的资源,基类也有可能并且实际上是常见的。 对于必须完全通用运行的代码,或者对于已知AutoCloseable实例需要释放资源的代码,建议使用try-with-resources构造。 但是,当使用诸如Stream的工具同时支持基于I / O和基于非I / O的形式时,使用非基于I / O的形式时通常不需要使用资源尝试块。

简而言之,从Java 8开始, AutoCloseable更具暗示性,表明您可能正在使用需要关闭的资源,但这并非一定如此。

这类似于Iterable合同,后者没有说明您只能在Iterable进行一次还是多次迭代,但是它强加了foreach循环所需的合同。

我们什么时候拥有“可选的可关闭”资源?

以jOOQ为例。 与JDBC不同,jOOQ 查询 ( 在jOOQ 3.7中被设置为AutoCloseable )可能表示资源,也可能不表示资源,这取决于您如何执行。 默认情况下,它不是资源:

try (Connection c = DriverManager.getConnection("jdbc:h2:~/test", "sa", "")) {// No new resources created here:ResultQuery<Record> query =DSL.using(c).resultQuery("SELECT 1 + 1");// Resources created and closed immediatelySystem.out.println(query.fetch());
}

输出再次是:

+----+
|   2|
+----+
|   2|
+----+

但是现在,我们再次在query变量上出现了Eclipse警告,说有一个资源需要关闭,即使通过这种方式使用jOOQ,我们知道事实并非如此。 上面的代码中唯一的资源是JDBC Connection ,并且已正确处理。 jOOQ内部的jOOQ PreparedStatementResultSet已完全处理,并急切地关闭了。

然后,为什么要首先实现AutoCloseable?

jOOQ与JDBC的默认行为相反。

  • 在JDBC中,默认情况下所有工作都是延迟进行的,并且必须显式关闭资源。
  • 在jOOQ中,默认情况下会急切地完成所有工作,并且可以有选择地使资源保持活动状态。

例如,以下代码将保持打开的PreparedStatementResultSet

try (Connection c = DriverManager.getConnection("jdbc:h2:~/test", "sa", "");// We "keep" the statement open in the ResultQueryResultQuery<Record> query =DSL.using(c).resultQuery("SELECT 1 + 1").keepStatement(true)) {// We keep the ResultSet open in the Cursortry (Cursor<Record> cursor = query.fetchLazy()) {System.out.println(cursor.fetchOne());}
}

在此版本中,我们在Eclipse中不再有任何警告,但是上述版本实际上是使用jOOQ API时的例外。

Java 8的Stream API也是如此。 有趣的是,Eclipse在这里不发出任何警告:

Stream<Integer> stream = Arrays.asList(1, 2, 3).stream();
stream.forEach(System.out::println);

结论

首先,资源泄漏检测似乎是一个不错的IDE /编译器功能。 但是,避免误报很难。 具体而言,因为Java 8改变了合同AutoCloseable ,实现者被允许执行AutoCloseable为一种方便的契约,而不是作为一种资源存在,必须关闭的清晰指示符。

这使IDE很难(甚至不是不可能)检测第三方合同(非JDK API)的资源泄漏,而这些合同通常并不为人所知。 与静态代码分析工具一样,该解决方案通常会关闭潜在的资源泄漏检测:

资源泄漏解决方案

  • 有关更多的见解,另请参见Stuart Marks的Stack Overflow答案,该链接与EG关于lambda-dev的讨论相关联

翻译自: https://www.javacodegeeks.com/2015/12/subtle-autocloseable-contract-change-java-7-java-8.html

java自动生成合同

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

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

相关文章

Python学习(1)

1.str字符串操作 len(str) 计算字符串长度 str.replace(xxx,xxxx) 替换指定字符 str.upper()字符串转大写 str.lower()字符串转小写 str.strip()删除左右多余的空格 str.lstrip()删除左边多余的空格 str.rstrip()删除右边的空格 format(a,b,c) 传参显示 2.索引 out hello wo…

opencv求两张图像光流_光流(optical flow)和openCV中实现

转载请注明出处&#xff01;&#xff01;&#xff01;光流(optical flow)和openCV中实现光流的概念&#xff1a;是Gibson在1950年首先提出来的。它是空间运动物体在观察成像平面上的像素运动的瞬时速度。是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一…

storm apache_Apache Storm的实时情绪分析示例

storm apache实时情感分析是指处理自然语言文本&#xff08;或语音&#xff09;流以提取主观信息。 琐碎的用例用于构建推荐引擎或查找社交媒体趋势。 我选择了Apache Storm作为实时处理引擎。 Storm非常强大&#xff08;我们正在生产中使用它&#xff09;&#xff0c;并且非常…

怎么用python画圆的公式_怎么用python画圆

python中内置了许多第三方库&#xff0c;来帮助它完成各种功能。Turtle库就是Python语言中一个很流行的绘制图像的函数库(推荐学习&#xff1a;Python视频教程)Turtl库用于绘制线、圆、其他形状或者文本这个库被介绍为一个最常用的用来给孩子们介绍编程知识的方法库&#xff0c…

嵌入式java基准测试_Java正则表达式库基准测试– 2015年

嵌入式java基准测试在尝试使Java在计算机语言基准游戏的regexdna挑战中排名第一时&#xff0c;我正在研究Java正则表达式库的性能。 我可以找到的最新网站是2010年的tusker.org 。因此&#xff0c;我决定使用Java Microbenchmarking Harness重做测试并发布结果&#xff08;破坏…

libgdx和unity_libgdx和Kotlin –类[2D平台原型]

libgdx和unity这篇文章是libgdx和Kotlin文章的后续文章。 我已经决定开发一个简单的2D平台程序的原型&#xff08;沿着我的早期文章中的Star Assault进行介绍&#xff09;&#xff0c;但是我一直在使用和学习Kotlin&#xff0c;而不是Java。 对于本教程&#xff0c;该项目应处…

java1.7开发环境_在Windows平台搭建Java 1.7开发环境

OS&#xff1a;Windows 7 or laterJava Version: 1.7.x本文具体的演示环境是&#xff1a;Windows 8.1&#xff0c;Java 1.7.0_45。一、安装JDK需要注意的是安装路径中不要出现非西文符号。实际上我一般喜欢在安装路径中也尽可能不出现空格。比如&#xff1a;在我的PC上&#xf…

gluon_带有Gluon Ignite和Dagger的JavaFX中的依赖注入

gluon依赖注入抽象框架Gluon Ignite在几个流行的依赖注入框架&#xff08;例如Spring&#xff0c;Dagger和Guice&#xff09;上创建了一个通用抽象。 目前&#xff0c;Gluon 页面仅包含一个示例&#xff0c;该示例使用Gluon Ignite和Google Guice作为依赖注入框架&#xff0c;…

couchbase_具有Couchbase,Java EE和WildFly的CRUD Java应用程序

couchbaseCouchbase是一个开源的NoSQL文档数据库。 它允许访问&#xff0c;索引和查询JSON文档&#xff0c;同时利用集成的分布式缓存来实现高性能数据访问。 开发人员可以使用不同的语言&#xff08;Java&#xff0c;Go&#xff0c;.NET&#xff0c;Node&#xff0c;PHP&…

java 对象的态_Java面向对象-------多态总结

1.多态&#xff1a;是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口&#xff0c;使用不同的实例而执行不同操作&#xff0c;如图所示&#xff1a;多态性是对象多种表现形式的体现。2.多态作用&#xff1a;1. 消除类型之间的耦合关系2. 可替换性3. 可扩充性4…

netbeans连接数据库_NetBeans Java EE技巧#1 –数据库中的实体类

netbeans连接数据库NetBeans IDE是开发各种应用程序的绝佳选择。 具体来说&#xff0c;我每天都使用它来开发和维护Java EE应用程序。 在过去的几个发行版中&#xff0c;不仅Java EE的生产力提高了&#xff0c;而且NetBeans IDE还减少了开发应用程序的时间……使Java EE和NetBe…

jboss fuse 教程_使用JBoss Fuse和OpenShift进行Cloud Native Camel骑行

jboss fuse 教程红帽公司最近发布了一个微服务集成工具包&#xff0c;用于在OpenShift v3的Docker和Kubernetes环境中运行我们的微服务。 为了帮助人们更好地理解这一点&#xff0c;我将Rider Auto应用程序迁移到一组微服务中&#xff0c;该应用程序已经存在了一段时间&#xf…

javaone_JavaOne 2015 –又一年,又向前迈进了一步

javaoneJavaOne 2015 San Francisco于10月25日至29日举行。 我很自豪地说这是我第九个人参加JavaOne&#xff0c;第七个人是演讲者&#xff0c;第四个人是Oracle员工&#xff0c;第三个人是内容委员会成员&#xff0c;第二个人是项目负责人。 我认为对于JavaOne来说&#xff0c…

lnp和mysql分开安装_毕业设计之LNP+DISCUZ +分离的数据库操作

环境介绍&#xff1a;CentOS6.9最小化安装https://nginx.org/download/nginx-1.16.1.tar.gzhttps://www.php.net/distributions/php-7.3.14.tar.gzhttps://cdn.mysql.com//Downloads/MySQL-5.7/mysql-boost-5.7.29.tar.gznginxphp主机&#xff1a;192.168.111.141mysql主机&…

java中hotspot_Java 8中HotSpot选项的改进文档

java中hotspotOracle的HotSpot Java 8实现中引入的一些小但受欢迎的功能之一是在启动器的文档中添加了许多常见的HotSpot Java启动器 &#xff08; java &#xff09;选项/标志。 过去&#xff0c;甚至对某些相当常见的HotSpot JVM选项都感兴趣的开发人员不得不潜在地寻找多个不…

qchart折现图_Qt开发技术:QCharts(二)QCharts折线图介绍、Demo以及代码详解

若该文为原创文章&#xff0c;未经允许不得转载各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究敬请期待…红胖子&#xff0c;来也&#xff01;介绍了整体框架&#xff0c;开始动手码代码&#xff0c;按照顺…

各类算法思想

暴力枚举法 使用场景注意事项 1.建立一个简洁的搜索模型&#xff0c;变量尽可能少 2.尽可能减少搜索空间 递归与分治法 分治使用最广泛一类算法。采用递归的思想将较大规模的问题分成小问题来求。如果原问题可以分割成k个子问题&#xff0c;并且这些子问题可以重复利用&am…

eclipse neon_在自定义Java 9映像上运行Eclipse Neon

eclipse neon我已经开始修改自定义Java二进制运行时映像文件。 映像文件是打包为运行时平台的模块的配置。 基本上&#xff0c;默认映像包含组成Java运行时的所有内容。 自定义图像可以包含该图像的一些子集。 例如&#xff0c;我创建了一个仅包含“ compact 3”概要文件的映像…

java json注解_返回json用什么注解

返回json用“ResponseBody”注解&#xff0c;“ResponseBody”是作用在方法上的&#xff0c;“ResponseBody”表示该方法的返回结果直接写入“HTTP response body”中。本篇文章将介绍两种示例进行JSON返回注解方式演示。示例1ResponseBody是作用在方法上的&#xff0c;Respons…

java数据结构博客园_常见数据结构的Java实现

单链表的Java实现首先参考wiki上的单链表说明&#xff0c;单链表每个节点包含数据和指向链表中下一个节点的指针或引用。然后看代码import java.lang.*;public class SinglyLinkeList{Node start;public SinnglyLinkedList(){this.startnull;}public void addFront(Object newD…