Java编程中资源对象管理的进化-阿里云开发者社区

开发者社区> chszs> 正文

Java编程中资源对象管理的进化

简介: 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/81509169 Java编程中资源对象管理的进化 2018.8.8 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。
+关注继续查看
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/81509169

Java编程中资源对象管理的进化

  • 2018.8.8
  • 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。

使用Java开发业务时,常常需要处理资源,这是很常见的需求。

Java 7以前

在Java 7以前,处理(关闭)资源是这样的:

public static int getAccountStatusCodeFromDataStore_traditional(String accountId) throws SQLException {
    String accountStatusCodeQuery = getAccountStatusCodeQuery(accountId);
    Statement statement = null;
    ResultSet resultSet = null;
    try {
        statement = createStatementFromConnection();
        resultSet = statement.executeQuery(accountStatusCodeQuery);
        return getAccountStatusCodeFromResultSet(resultSet);
    } finally {
        if (resultSet != null)
            resultSet.close();
        if (statement != null)
            statement.close();
    }
}

开发人员必须关闭创建的所有资源,否则会导致资源泄漏。

Java 7/8

而在Java 7中,引入了try-with-resources的新方法,可以在try-catch块中使用的正确顺序自动处理资源的关闭,比如:

public static int getAccountStatusCodeFromDataStore_java7(String accountId) throws SQLException {
    String accountStatusCodeQuery = getAccountStatusCodeQuery(accountId);
    try (Statement statement = createStatementFromConnection();
            ResultSet resultSet = statement.executeQuery(accountStatusCodeQuery)) {
        return getAccountStatusCodeFromResultSet(resultSet);
    }
}

在此示例中,可以看到代码更简洁了,整体可读性提高了,它实现了资源的自动管理。我们可以在try-with-resources语句中拥有多个资源,且多个资源的声明之间应该用分号分隔。当这些资源在自动关闭时,也会保持声明的反向逻辑顺序依次关闭(最后声明的资源将首先关闭)。

如果这里要抛出异常,try块的异常会会压制try-with-resources块的异常。如果确实有需要,可以通过从try块抛出的异常中调用Throwable.getSuppressed方法来检索被try块抑制的异常。

另外,try-with-resources语句也可以有catch和finally块。在声明的资源被关闭后会运行任何catch或finally块。

Java 9

而到了Java 9时代,对于try-with-resources的资源处理,Java 9中引入了更简洁的版本。如果开发者已经将资源声明为final或effective final类型,那么可以在try-with-resources中直接使用它们而无需创建任何新变量。这使得我们可以进一步利用自动资源管理。上面的代码现在可使用更简洁的try-with-resources实现,如下:

public static int getAccountStatusCodeFromDataStore_java9(String accountId) throws SQLException {
    String accountStatusCodeQuery = getAccountStatusCodeQuery(accountId);
    // 明确声明final
    final Statement statement = createStatementFromConnection();
    // effective final
    ResultSet resultSet = statement.executeQuery(accountStatusCodeQuery);
    try (statement; resultSet) {
        return getAccountStatusCodeFromResultSet(resultSet);
    }
}

可见,代码的易读性提高了。

其实大多数的资源类在背后实现了AutoCloseable或Closeable接口,因此与try-with-resources语句协同工作才实现了自动资源管理。如果我们处理的资源没有实现AutoCloseable或Closeable接口,那么就必须遵循传统的方法来关闭资源。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
网络资源-黑马程序员Java 知识——精华总结
获取更多资源Java帮帮IT资源分享网 一、黑马程序员—java 概述与基础知识.................................................................................6 1、何为编程?..............................................................
2184 0
Java 文件上传下载管理器(控制台)
Java 文件上传下载管理器(控制台)
2731 0
消灭“脑细胞杀手”,阿里专家带你深入C++对象的生命周期管理
C/C++的指针一直是令人又爱又恨的特性。围绕指针产生了许许多多优雅的数据结构和系统实现,但又滋生了不少“脑细胞杀手”——内存Bug。如何通过指针管理C++中对象,如何管理对象的生命周期呢?本文中,阿里巴巴高级开发工程师付哲就为大家分享《C++对象的生命周期管理》。
4271 0
SAS学习笔记之《SAS编程与数据挖掘商业案例》(3)变量操作、观测值操作、SAS数据集管理
SAS学习笔记之《SAS编程与数据挖掘商业案例》(3)变量操作、观测值操作、SAS数据集管理 1. SAS变量操作的常用语句 ASSIGNMENT 创建或修改变量 SUM 累加变量或表达式 KEEP 规定在数据集中保留的变量 DROP 规定在数据集中删除的变量 ARRAY 定义一个数组 RENAME
1431 0
编程实战——电影管理器之XML存储电影信息数据
但凡管理器之类的软件,存储数据是必不可少的。存储数据的话,有几种选择。一是用数据库,把数据存储到数据库里;一是用文本文件,把数据存储到文本文件里;一种是利用XML文件,把数据对象转换为XML后,存储到XML文件(实际上也是文本文件)。
723 0
阿里巴巴开源OpenJDK长期支持版本,Java全球管理组织唯一中国企业
3月19日据媒体报道,阿里巴巴即将开源OpenJDK长期支持版本Alibaba Dragonwell,为全球Java界开发者提供了一个新的选择。
12299 0
编程实战——电影管理器之利用MediaInfo获取高清视频文件的相关信息
随着高速(20M)宽带、HTPC、大容量硬盘(3T)的普及,下载高清片并利用大屏幕观看也成为普通的事情。 随着下载影片的增多,管理就有了问题,有时在茫茫文件夹下找寻一个影片也是一件费时费力的事。 于是萌生了自己编写电影管理器的想法,并逐步逐步在实现。
745 0
+关注
841
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载