【问题标题】:Painless resource management in javajava中的无痛资源管理
【发布时间】:2010-09-08 16:23:18
【问题描述】:

在 C++ 中,我们在构造函数中获取资源并在析构函数中释放它。

因此,当函数中间出现异常时,不会出现资源泄漏或锁定互斥锁或其他任何情况。

AFAIK java 类没有析构函数。那么在Java中是如何进行资源管理的呢。

例如:

public int foo() {    
    Resource f = new Resource();
    DoSomething(f);
    f.Release();
}

如果 DoSomething 抛出异常,如何释放资源?我们不能在整个代码中放置 try\catch 块,可以吗?

【问题讨论】:

    标签: java resources


    【解决方案1】:

    是的,您可以并且应该在代码周围放置 try/catch/finally 块。在 C# 中有一个简写的“使用”语句,但在 Java 中你会遇到:

    public int foo() {
        Resource f = new Resource();
        try {
            DoSomething(f);
        }
        finally {
            f.Release();
        }
    }
    

    【讨论】:

      【解决方案2】:

      这个问题可以追溯到 2008 年,因此与 Java 6 相关。从那时起,Java 7 已经发布,其中包含自动资源管理的新功能。有关与 Java 7 相关的最新问题,请参阅此问题:

      java techniques for automatic resource release? "prompt cleanup"?

      【讨论】:

        【解决方案3】:

        可以使用 Execute around 成语来分解 try/finally(以及异常和算法)。但是语法非常冗长。

        public int foo() {
            withResource(new WithResource() { public void run(Resource resource) {
                doSomething(resource);
            }});
        }
        
        ...
        
        public interface WithResource {
            void run(Resource resource);
        }
        
        public static void withResource(WithResource handler) {
            Resource resource = new Resource();
            try {
                handler.run(resource);
            } finally {
                resource.release();
            }
        }
        

        如果你抽象的比 try/finally 更多,这种事情会更有意义。例如,使用 JDBC,您可以执行语句、遍历结果、关闭资源并包装异常。

        【讨论】:

        • with(new Resource() { public void do(Resource resource) .... 读起来稍微好一点。:-)
        【解决方案4】:

        如果你想让 using 块参与到 Java 闭包辩论中:S

        【讨论】:

          【解决方案5】:

          很抱歉让您失望了,但在 Java 中我们确实使用 try\catch\finally 会阻塞很多。 “很多”是指很多。我有时确实希望 Java 有 C# using 块。大多数情况下,您不需要释放资源,因为 Java 的垃圾收集器会处理这些问题。

          但是,异常确实可以使错误处理更加简洁。您可以编写自己的异常并在您正在执行的任何操作中捕获它们。不再向用户返回任意错误代码!

          【讨论】:

          • 是的!让我们开始将丑陋的、令人困惑的堆栈跟踪返回给它们!
          • 啊,获得 NullPointerException 而不是 -429321313 错误代码对话框的奇迹。作为一名开发人员让我感到自豪:)
          • Java 7 将具有“资源管理”功能,该功能会在使用特殊形式的 try 块时关闭所有 Closeable 资源。
          • @Vinko:与堆栈跟踪转储相比,错误代码毫无价值。此外,如果您向用户返回堆栈跟踪,那么您做错了什么,这就是我们有“记录器框架”的原因。 ;P
          • 这个问题的日期是 2008 年,它询问的是 Java 6。有关 Java 7 的自动资源管理的最新问题,请参阅stackoverflow.com/questions/6628611/…
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-10-12
          • 2021-06-26
          • 2012-06-25
          • 2011-09-26
          • 2011-12-02
          • 2011-01-27
          • 2012-10-26
          相关资源
          最近更新 更多