为了账号安全,请及时绑定邮箱和手机立即绑定

Java SE 9:Try-With-Resources Improvements

标签:
Java

Java SE 9:Try-With-Resources Improvements


目录[ 隐藏 ]

发布简要目录:

  • 介绍

  • Java SE 7:资源尝试基础知识

  • Java SE 7:资源试用规则

  • Java SE 9:资源试用改进

介绍

Oracle Corporation将于2017年3月底发布Java新版本:Java SE 9.所以,我想提供一系列有关Java SE 9新功能的帖子。这是我在这个系列中的第八篇文章。

在这篇文章中,我们将讨论Java SE 9中对Try-With-Resources的一些改进。让我们现在开始探索该构造。

Java SE 7:资源尝试基础知识

Java SE 7引入了一个新的构造:Try-With-Resources语句,以便更好地进行异常处理。如果没有这个结构,开发人员必须编写大量冗余和丑陋的代码。如果开发人员忘记了正确关闭资源,我们将在应用程序中遇到资源泄漏问题。

这个新功能的主要目标是:

  • 句法糖

避免写一些提取catch / finally块。

更好的可读代码

无需进行空检查

无需检查资源引用是指引用对象还是null。

更好的资源管理

ARM(自动资源管理)

避免内存泄漏

试用资源示例-1: -

void testARM_Before_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt")); try (BufferedReader reader2 = reader1) {
   System.out.println(reader2.readLine());
 }}

这里我们创建了一个实用程序方法,它创建一个BufferedReader对象来读取文件的内容。如果我们观察上面的代码片段,即使我们有reader1引用BufferedReader对象,我们也应该创建一个重复的“reader2”来在Try-With-Resources中使用它。这是Java SE 7或8版本中的一个小错误或问题。

我们不能在Try-With-Resources语句的try()块中使用任何资源(在Try-With-Resources之外声明)。

以下代码在Java SE 7或8版本中无效。它会抛出编译时错误。

试用资源示例-2: -

void testARM_Before_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt")); try (reader1) {
   System.out.println(reader1.readLine());
 }}

注意: -
如果您想了解有关此组件的更多信息,请阅读本教程:Java SE 7:Try-with-Resources

Java SE 7:资源试用规则

在Java SE 7或8版本中,我们应遵循这些规则以使用Try-With-Resources语句进行自动资源管理(ARM)

  • 任何资源(预定义的Java API类或用户定义的类)都必须实现java.lang.AutoCloseable。

  • 资源对象必须引用最终或有效的最终变量

  • 如果已经在Try-With-Resources语句之外声明了Resource,我们应该使用局部变量重新引用(如上面的Example-1代码所示)

  • 新创建的局部变量在Try-With-Resources语句中有效。

Java SE 9:资源试用改进

Java SE 9为Try-With-Resources语句提供了一些改进。正如我们在前面部分中讨论的那样,Java SE 7或8版本对此语句有一个小问题或错误。

在Java SE 9中,如果我们有一个资源已经在Try-With-Resource语句之外声明为final或者有效的final,那么我们不需要声明一个局部变量。我们可以在Try-With-Resource Statement中使用以前创建的变量而不会出现任何问题,如下所示:

试用资源示例-3: -

void testARM_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt")); try (reader1) {
   System.out.println(reader1.readLine());
 }}

此示例是Java SE 9的有效代码。我们不创建另一个局部变量,如reader2,以引用reader1,如Example-1所示。让我们在Java SE 9 REPL中执行这两个示例来测试它们。

使用Java SE 9 REPL的测试示例-1: -

jshell> void testARM_Before_Java9() throws IOException{
   ...> BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
   ...> try (BufferedReader reader2 = reader1) {
   ...> System.out.println(reader2.readLine());
   ...> }
   ...> }|  created method testARM_Before_Java9()

jshell> testARM_Before_Java9()
journaldev

使用Java SE 9 REPL的测试示例-3: -

jshell> void testARM_Java9() throws IOException{
   ...> BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
   ...> try (reader1) {
   ...> System.out.println(reader1.readLine());
   ...> }
   ...> }|  created method testARM_Java9()

jshell> testARM_Java9()
journaldev

这就是“Java SE 9:尝试资源改进”的新功能。我们将在以后的帖子中讨论更多Java SE 9新功能。

如果您喜欢我的帖子或有任何问题/建议/类型错误,请给我发表评论。

感谢您阅读我的教程。

快乐的Java SE 9学习!



点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消