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

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接口,那么就必须遵循传统的方法来关闭资源。

原文 

https://blog.csdn.net/chszs/article/details/81509169

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Java编程中资源对象管理的进化

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址