Javaにデストラクタはありますか?

写真:José Alejandro Cuffia On Unsplash

Javaでは、ガベージコレクタは未使用のオブジェクトを自動的に削除してメモリを解放します。 開発者は、削除のためにオブジェクトをマークする必要はありません,これはエラーが発生しやすく、メモリリークに対して脆弱です. だから、javaにはデストラクタが利用できないのは賢明です。

オブジェクトが開いているソケット、開いているファイル、またはデータベース接続を保持している場合、ガベージコレクタはそれらのリソースを再利用 リソースをcloseメソッドで解放し、try-finally構文を使用して、I/OクラスFileInputStreamやFileOutputStreamなどのJava7より前のメソッドを後で呼び出すことができます。 Java7では、インターフェイスAutoCloseableを実装し、try-with-resources文を使用して短くてクリーンなコードを書くことができます。 しかし、APIユーザーがcloseメソッドを呼び出すのを忘れる可能性があるため、finalizeメソッドとCleanerクラスがセーフティーネットとして機能するようになります。 しかし、それらはデストラクタと同等ではないことに注意してください。

finalizeメソッドとCleanerクラスの両方が迅速に実行されることは保証されていません。 彼らはJVMが終了する前に実行する機会さえ得られません。 我々はシステムを呼び出すことができますが。runFinalization JVMがファイナライズのために保留中のオブジェクトのfinalizeメソッドを実行することを提案するには、まだ非決定論的です。 さらに、finalizeメソッドは、パフォーマンスの問題、デッドロックなどを引き起こす可能性があります。 より多くの情報は、私たちの記事の1つを見て見つけることができます:Javaのfinalizeメソッドへのガイド。 Java9では、欠点があるため、Finalizeメソッドを置き換えるためにCleanerクラスが追加されました。 その結果、私達にクリーニングの行為をする糸のよりよい制御があります。 しかし、javaの仕様は、システム中のクリーナーの動作を指摘しています。exitは実装固有であり、Javaはクリーニングアクションが呼び出されるかどうかを保証しません。

コメントを残す

メールアドレスが公開されることはありません。