用于对象生命周期结束的Java技术

时间:2013-08-20 13:36:28

标签: java

经验丰富的Java程序员寻求你的智慧:

如果没有办法确保某个特定的块代码在对象超出范围时执行,那么还有哪些方法可以提供相同的功能? (似乎最终确定并不意味着那个)

一个典型的例子是范围锁定习语:

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 个答案:

答案 0 :(得分: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.
  }

答案 1 :(得分:2)

从Java 7开始,有自动资源管理。如果您的锁在您的控制范围内,请将其设为AutoCloseable。不幸的是,java.util.concurrent锁没有实现这个接口。 Here's a good reference详细说明。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

如果你想在一个METHOD中运行一些代码,只需使用try ... finally ....最后一个块保证运行。或者,在Java 7中,使用“with”块。

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