检查在收集对象之前是否调用了方法

时间:2014-09-04 00:31:41

标签: java destructor finalizer

我有一个用户通常使用我的工厂创建的对象。我想确保我的用户在将它们扔进垃圾收集器之前调用object.undo()。

此类设置必要的资源,因此用户不会写入生产服务,而是使用特定于测试的服务。用户需要调用undo来恢复其覆盖。

这是我希望用户做的事情

// in setup()
FooObject object = FooFactory.overrideProductionServicesToTestServices();

// do your testing in test*()

// in tearDown()
object.undo()

以下是用户最终做的事情

// in setup()
FooFactory.overrideProductionServicesToTestServices()

// do their testing. Everything works.

// Another test, everything breaks

如何通过抛出异常或通过类设计通知用户用户应该调用undo()?

3 个答案:

答案 0 :(得分:1)

为什么不将PhantomReference存储到工厂内创建的对象中,而不是使用性能影响并且容易出错的终结器?

来自Javadocs

  

幻像引用最常用于以比Java终结机制更灵活的方式调度预先清理操作。

您可以让工厂跟踪该引用的关联ReferenceQueue,一旦对象入队,执行通常由undo完成的清理操作。

答案 1 :(得分:0)

  

我想确保我的用户在将它们扔进垃圾收集器之前调用object.undo()

您可以实施finalize()方法并在其中调用object.undo(),以确保它在收集垃圾之前先运行。

像这样:

protected void finalize()
             throws Throwable {
    this.undo();
}

详细了解finalize()方法,go to this article on Oracle.

答案 2 :(得分:0)

  

终结者不能抛出异常

Yes it can,但你必须小心。在finalize()中调用方法的正确方法如下:

protected void finalize() throws Throwable
{
    try
    {
       myMethod();
    }
    finally
    {
      super.finalize();
    }
}