5

在查看 JAX_WS 端点的要求时,我遇到了这个问题,

JAX-WS endpoint implementation class must not implement `finalize()` method.

但我没有找到更好的答案来解释这一点。为什么我们不应该实现 finalize() 方法,如果我们实现会发生什么?

有人可以解释一下吗?

4

1 回答 1

3

正如您所解释的,JAX-WS 端点不应该实现 finalize 方法(检查这个)。

为什么?

JVM 不保证 finalize 方法的执行。理论上,对象被垃圾回收时会调用finalize方法,但是什么时候会被回收呢?没有办法知道:有时它会立即被收集,也许它会一直活着,直到 JVM 停止(这意味着永远不会)。其实这和 GC 算法有关,每个 JVM 都有自己的 implementation(s),而且每个都有很大的不同,因为这个算法的行为没有规范。

但真正的问题是一些java程序员不知道这一点,他们使用finalize方法作为“析构函数”。一个例子:你有一个在它的构造函数中创建一个 JDBC 连接的类。因此,为了让它变得更好,您决定在“析构函数”(最终确定)中释放此连接。后果:你不知道连接什么时候会关闭,或者永远不会关闭!!!

这就是为什么实现 finalize 方法对于任何 java 类都被认为是一种不好的做法,并且在某些框架中被禁止以避免误解(即 JAX-WS)。

恕我直言,这个方法应该从ObjectAPI 中删除,但它仍然存在......也许是为了向后兼容或我无法想象的有用用法;-)

检查以了解有关最终实施的更多意见。

于 2012-07-16T12:36:47.133 回答