代码之家  ›  专栏  ›  技术社区  ›  Dat Chu

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

  •  0
  • Dat Chu  · 技术社区  · 10 年前

    我有一个用户通常使用我的工厂创建的对象。我希望确保我的用户在将对象放入垃圾收集器之前调用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 回复  |  直到 10 年前
        1
  •  1
  •   Thorn G    10 年前

    与其使用终结器(它会带来性能影响,而且很容易出错),不如存储一个 PhantomReference 到工厂内创建的对象?

    Javadocs :

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

    你可以让工厂跟踪相关的 ReferenceQueue 对于该引用,在对象入队后,执行通常由执行的清理操作 undo .

        2
  •  0
  •   lxcky    10 年前

    我想确保我的用户呼叫 object.undo() 在他们把它扔进垃圾收集器之前。

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

    这样地:

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

    阅读更多关于 finalize() 方法 go to this article on Oracle.

        3
  •  0
  •   user207421    10 年前

    终结器无法引发异常

    Yes it can ,但必须小心 finalize() 如下所示:

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