如何实现Java的构造函数/析构函数对称性

时间:2019-03-10 05:26:19

标签: java destructor dispose finalizer

来自C ++背景,我喜欢在对象的构造和破坏中具有某种“对称性”。例如,构造函数以与构造函数相反的顺序分配资源,附加事件处理程序,而析构函数分离事件处理程序并释放资源。

在C#中,我通常使用“ Dispose”模式来创建该行为。我没有使用析构函数,因为据我所知,析构函数可能是从随机线程中调用的,如果我的对象的解构包含UI调用,则可能是个问题。

如何模仿Java中的这种行为? Java不适合这样做吗? Java是否喜欢另一种方法?我不想以不同于设计使用的方式使用Java。

我已经搜索过SO,但是人们说没有诸如析构函数(我已经知道)或类似Dispose的方法之类的东西。有没有一种方法可以实现这种构造/销毁“对称性”,而无需由垃圾收集器从随机线程中调用销毁部分?还是我以错误的方式看待事物?谢谢。

2 个答案:

答案 0 :(得分:2)

与您要查找的内容最接近的是实现Closeable或AutoCloseable,然后在try-with-resources块中使用您的类(或在finally块中自己调用.close())。但是,请确保您对实际上是稀缺资源的事情需要这样做。

答案 1 :(得分:2)

这里的根本区别在于,当对象被垃圾收集器收集时,您无法使用Java进行控制。更糟糕的是,甚至无法保证 finalize()方法实际上在对象被收集之前就被调用了。

因此,真正的答案是:Java不提供这种对称性!

正如另一个答案所暗示的那样,启用“某种程度的控制”的最接近的语言功能实际上是在实现AutoCloseable接口。