JAX_WSエンドポイントの要件を調べたときに、これに出くわしました。
JAX-WS endpoint implementation class must not implement `finalize()` method.
しかし、私はこれを説明するより良い答えを見つけられませんでした。なぜfinalize()メソッドを実装すべきではないのですか?実装した場合はどうなりますか?
誰かがこれに光を当てることができますか?
JAX_WSエンドポイントの要件を調べたときに、これに出くわしました。
JAX-WS endpoint implementation class must not implement `finalize()` method.
しかし、私はこれを説明するより良い答えを見つけられませんでした。なぜfinalize()メソッドを実装すべきではないのですか?実装した場合はどうなりますか?
誰かがこれに光を当てることができますか?
説明したように、JAX-WSエンドポイントはfinalizeメソッドを実装するべきではありません(これを確認してください)。
なんで?
ファイナライズメソッドの実行は、JVMによって保証されていません。理論的には、オブジェクトがガベージコレクションされるときにfinalizeメソッドが呼び出されますが、それが収集されるのはいつですか?知る方法はありません。すぐに収集されることもあれば、JVMが停止するまで生きていることもあります(これは決して意味がありません)。実際、これはGCアルゴリズムに関連しており、各JVMには独自の実装があり、このアルゴリズムの動作の仕様がないため、それぞれが大きく異なります。
しかし、本当の問題は、一部のJavaプログラマーがこれを知らず、finalizeメソッドを「デストラクタ」として使用することです。例:コンストラクターにJDBC接続を作成するクラスがあります。したがって、わかりやすくするために、この接続を「デストラクタ」(ファイナライズ)で解放することにします。結果:接続がいつ閉じられるかわからない、または接続が閉じられない可能性があります!!!
これが、finalizeメソッドの実装がすべてのJavaクラスにとって悪い習慣であると見なされ、一部のフレームワークでは誤解を避けるために禁止されている理由です(つまり、JAX-WS)。
私見ですが、このメソッドはObject
APIから削除する必要がありますが、それでも存在します...下位互換性や、想像を絶する便利な使用法のためかもしれません;-)
ファイナライズの実装に関するその他の意見については、これを確認してください。