7

经验丰富的 Java 新手正在寻求您的智慧:

如果无法确保在对象超出范围时执行某些特定的块代码,那么还有哪些其他方法可以提供相同的功能?(似乎 finalize 显然不是为了那个)

一个经典的例子是作用域锁成语:

void method()
{
    // Thread-unsafe operations {...}

    { // <- New scope
        // Give a mutex to the lock
        ScopedLock lock(m_mutex);

        // thread safe operations {...}

        if (...) return; // Mutex is unlocked automatically on return

        // thread safe operations {...}

    } // <- End of scope, Mutex is unlocked automatically

    // Thread-unsafe operations {...}
}

我可以理解,在 Java 中,如果您没有显式调用它,那么执行一些代码是不受欢迎的。但是我发现能够在对象生命周期结束时强制执行一些代码是一个非常强大的功能,可以确保客户端代码合理地使用您的类。谢谢

4

4 回答 4

9

通常 - 如果您需要实际关闭/处置资源,则try{} finally{}鼓励使用结构。

  // The old way - using try/finally
  Statement stmt = con.createStatement();
  try {
    ResultSet rs = stmt.executeQuery(query);
    while (rs.next()) {
      // ...
    }
  } catch (SQLException e) {
    // Whatever ... .
  } finally {
    // Be sure to close the statement.
    if (stmt != null) {
      stmt.close();
    }
  }

Java 的最新版本具有AutoCloseable接口,您可以将其与该with机制一起使用。所有Closeable对象都是自动的AutoCloseable

  // Example of what is called try-with
  try (Statement stmt = con.createStatement()) {
    ResultSet rs = stmt.executeQuery(query);
    while (rs.next()) {
      // ...
    }
  } catch (SQLException e) {
    // Whatever ... stmt will be closed.
  }
于 2013-08-20T13:39:59.583 回答
2

从 Java 7 开始,有自动资源管理。如果你的锁在你的控制之下,那就让它实施AutoCloseable。不幸的是,java.util.concurrent锁没有实现这个接口。这里有一个很好的参考

于 2013-08-20T13:39:57.467 回答
1

替换finalize方法的另一个选项是PhantomReference. 如果您想在对象被垃圾收集之前执行一些操作,那么它提供了另一种比方法更好的finalize方法。

在这里查看示例:https ://weblogs.java.net/blog/kcpeppe/archive/2011/09/29/mysterious-phantom-reference

于 2013-08-20T13:44:23.107 回答
1

如果您希望在 METHOD 中运行某些代码,只需使用 try... finally.... finally 块保证运行。或者,在 Java 7 中,使用“with”块。

如果您希望某些代码像 C++ 的析构函数一样运行。恐怕Java中没有这种东西。finalize 方法不可靠,不能用于处理关键任务。Java 类通常做的方式是公开一个清理方法(例如这些流类的close()),以便客户端显式调用这些方法来完成清理工作。

于 2013-08-20T13:47:26.283 回答