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自动生成合同

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

  1. Java 7和Java 8之间的细微自动关闭合同更改

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

  2. java 自动生成条形码_JAVA生成商品条形码

    1.[代码][Java]代码 /* 2. * To change this template, choose Tools | Templates 3. * and open the template ...

  3. java 注解生成实例_Java 8 开发的 Mybatis 注解代码生成工具

    MybatisAnnotationTools MybatisAnnotationTools 是基于 Java8 开发的一款可以用于自动化生成 MyBatis 注解类的工具,支持配置数据源.类路径,表名 ...

  4. java自动生成类_自动生成优化的Java类专业知识

    java自动生成类 如果您今年访问过JavaOne,您可能已经参加了我的演讲"如何从数据库生成定制的Java 8代码". 在那次演讲中,我展示了如何使用Speedment Open ...

  5. java自动生成接口文档

    java自动生成接口文档 maven依赖 工具类 展示效果 首页 接口页 在平时的开发过程中必定要写接口文档 作为程序员 最烦的2件事 1.别人让你写接口文档 2.接手别人的项目没有接口文档 由此可见 ...

  6. Java自动生成PDF并进行邮件群发

    这段时间,公司承办一个互联网峰会,需要对4000多位客户发送邀请函,其中包括一个pdf文件和一封手写信,PDF中将从公司数据库中读取所有客户姓名,自动生成到相应位置,前期尝试Java自动生成pdf文件 ...

  7. Java自动生成二维码总结

    推荐一篇博客:Java自动生成带log的二维码 https://mp.csdn.net/postedit/84454677 第一种简单的方法: import java.io.File; import ...

  8. java自动生成sql语句

    java自动生成sql语句 艳学网强势来袭http://47.98.237.162/index,首次发布艳辉工具,第一个工具我们发布sql语句自动生成. 以前首次接触sql是在大学期间,刚开始是手写s ...

  9. java怎么生成字母_java自动生成字母

    新建一个类SpringContextUtil.java: import org.springframework.beans.BeansException; import org.springframe ...

最新文章

  1. matlab减,matlab-线性代数 矩阵的加、减、乘、除
  2. HDU 3333-Turing Tree(线段树解决离线询问)
  3. java和python哪个好就业2020-java和python哪个的前途更好?
  4. MySql 获取表的Comment
  5. 2009年上半年网络工程师考试下午试卷参考答案(二)
  6. POJ 1742 Coins ( 经典多重部分和问题 DP || 多重背包 )
  7. (数据库系统概论|王珊)第九章关系查询与关系优化:习题
  8. 殊途同归? 亚马逊和微软都选了云业务老大当公司CEO
  9. 简单查询(1.普通查询2.条件查询3.模糊查询4.排序查询5.统计查询(聚合函数)6.分组查询7.分页查询)...
  10. java调用js模板引擎_JavaScript模板引擎应用场景及实现原理详解
  11. Ulysses for Mac(最好用的纯文本编辑器)v22(65099)直装版
  12. 贪心宝贝话说上回讲到海东集团面临内外交困,公司的元老也只剩下XHD夫妇二人了。显然,作为多年拼搏的商人,XHD不会坐以待毙的。 一天,当他正在苦思冥想解困良策的时候,突然想到了自己的传家宝,那是公司成
  13. Unity Shader-法线贴图(Normal)及其原理
  14. sersync+rsync的热备份研究(热备+断点续传)
  15. 数据治理【数据安全管理】
  16. Vue.js 组件 - 组件间的循环引用
  17. 【Linux】常用命令:网络、内存、cron 超详细介绍
  18. html 多张图片自动滚动,JS实现图片的不间断连续滚动的简单实例
  19. grep命令的使用;正则;位置锚定
  20. 74LS244 三态门 功能介绍

热门文章

  1. CF1556F-Sports Betting【状压dp,数学期望】
  2. T183637-变异距离(2021 CoE III C)【单调栈】
  3. P5369-[PKUSC2018]最大前缀和【状压dp】
  4. P3128-最大流Max Flow【树上差分,LCA】
  5. P2468-[SDOI2010]粟粟的书架【主席树,二维前缀和】
  6. 【贪心】奶牛晒衣服(ybtoj 贪心-1-1)
  7. 初一模拟赛(5.4)
  8. Full_of_Boys训练6总结
  9. 2017西安交大ACM小学期数据结构 [树状数组 离散化]
  10. 汇编语言(三十一)之数字字符串加密与解密