5

JAX_WSエンドポイントの要件を調べたときに、これに出くわしました。

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

しかし、私はこれを説明するより良い答えを見つけられませんでした。なぜfinalize()メソッドを実装すべきではないのですか?実装した場合はどうなりますか?

誰かがこれに光を当てることができますか?

4

1 に答える 1

3

説明したように、JAX-WSエンドポイントはfinalizeメソッドを実装するべきではありません(これを確認してください)。

なんで?

ファイナライズメソッドの実行は、JVMによって保証されていません。理論的には、オブジェクトがガベージコレクションされるときにfinalizeメソッドが呼び出されますが、それが収集されるのはいつですか?知る方法はありません。すぐに収集されることもあれば、JVMが停止するまで生きていることもあります(これは決して意味がありません)。実際、これはGCアルゴリズムに関連しており、各JVMには独自の実装があり、このアルゴリズムの動作の仕様がないため、それぞれが大きく異なります。

しかし、本当の問題は、一部のJavaプログラマーがこれを知らず、finalizeメソッドを「デストラクタ」として使用することです。例:コンストラクターにJDBC接続を作成するクラスがあります。したがって、わかりやすくするために、この接続を「デストラクタ」(ファイナライズ)で解放することにします結果:接続がいつ閉じられるかわからない、または接続が閉じられない可能性があります!!!

これが、finalizeメソッドの実装がすべてのJavaクラスにとって悪い習慣であると見なされ、一部のフレームワークでは誤解を避けるために禁止されている理由です(つまり、JAX-WS)。

私見ですが、このメソッドはObjectAPIから削除する必要がありますが、それでも存在します...下位互換性や、想像を絶する便利な使用法のためかもしれません;-)

ファイナライズの実装に関するその他の意見については、これを確認してください。

于 2012-07-16T12:36:47.133 に答える