【问题标题】:Method to execute when a class instance falls out of scope?当类实例超出范围时执行的方法?
【发布时间】:2013-06-20 17:23:58
【问题描述】:

我有一个 C++ 类,用于跟踪被调用例程的进入和退出。

class myTrace{
    std::string  m_strName;
    myTrace( std::string strName ){
        m_strName = strName;
        _tprintf( _T("\n%s entering"), m_strName );
    };
    ~myTrace(){
        _tprintf(_T("\n%s exiting"), m_strName );
    };
};

它使用起来很简单,您将它实例化为使用堆栈机制在例程中完成的第一件事。当例程被调用时,它会打印出并输入消息。当例程退出时,它会打印出退出消息。

我正在尝试将其迁移到 java,但是我所做的关于没有析构函数的所有阅读都让我对在 java 中是否有任何方法可以做到这一点感到困惑?

-鲍勃·兰伯特-

【问题讨论】:

标签: java c++ migration


【解决方案1】:

理论上,你可以重写方法finalize,所以

public class MyClass {
    @Override
    protected void finalize() throws Throwable {
        System.out.println("exiting");
        super.finalize();
    }
}

当垃圾收集器确定没有更多对该对象的引用时,将调用this

所以当你这样做时

public static void myMethod()
{
MyClass a = new MyClass();
}

public static void main(String[] args) {
        myMethod();
        System.gc();
}

作为输出你会得到

退出

如果我记得在 C++ 中,析构函数用于在对象被销毁时释放内存,那么在 java 中我们不必担心这一点,GC 正在为我们做这件事。所以在大多数情况下,你不应该真的需要 destructos

【讨论】:

  • 我从之前关于这个主题的阅读中了解到这一点。问题是这是一个例程进入/退出跟踪机制,它绕过了正在跟踪的例程中意外或多个退出点的问题。跟踪的“退出”部分必须在例程退出时发生;不是当 GC 决定不再有引用时。可能是我在 C++ 中利用的类构造/破坏行为在 java 中没有类似物,需要实现替代解决方案。
  • 如果您遇到与意外退出点相关的问题,您可以使用 finally 块,它在您退出块后执行操作,这更接近您正在寻找的吗?
猜你喜欢
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 2015-12-18
相关资源
最近更新 更多