我有一个用户通常使用我的工厂创建的对象。我想确保我的用户在将它们扔进垃圾收集器之前调用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()?
答案 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();
}
}