[解決済み] なぜfinalize()を実装する必要があるのでしょうか?
質問
のルーキーJavaの質問をたくさん読んできました。
finalize()
がリソースをクリーンアップするための信頼性の低い方法であることを誰も明確にしないことに困惑しているようです。 コネクションを閉じることを保証する唯一の方法は try (catch) finally を実装することなので、これは本当に恐ろしいことです。
私はCSを学んだわけではありませんが、専門的にJavaでプログラミングを始めてから10年近く経ちますが、これまで誰も
finalize()
を、本番システムで使用したことは一度もありません。 それでも、使い道がないわけではありませんし、私が一緒に仕事をした人たちが正しくやっていたわけでもありません。
そこで質問なのですが、どのようなユースケースを想定して
finalize()
他のプロセスや言語内の構文でより確実に処理することができないものですか?
単にJavaの教科書やfinalizeの使用目的を繰り返すだけでは不十分ですし、この質問の意図とは異なりますので、具体的なシナリオやあなたの経験を教えてください。
どのように解決するのですか?
外部リソース(ソケット、ファイルなど)を保持するオブジェクトのバックストラップとして使用することができます。 を実装します。
close()
メソッドを呼び出し、それが必要であることを文書化します。
実装
finalize()
を実行するために
close()
の処理が行われていないことを検出した場合、その処理を行います。おそらく
stderr
バグのある呼び出し元の後始末をしていることを指摘するためです。
これは、例外的な/バギーな状況において、さらなる安全性を提供するものです。 すべての呼び出し元が正しい
try {} finally {}
のようなものが毎回あります。 残念なことですが、ほとんどの環境ではそうです。
めったに必要でないことは同意します。 そして、コメント欄で指摘されているように、GCのオーバーヘッドを伴う。 長時間稼働するアプリで、ベルトとサスペンダーのような安全性が必要な場合のみ使用してください。
Java9の時点ではそうなんですね。
Object.finalize()
は非推奨です! それらは私たちに
java.lang.ref.Cleaner
と
java.lang.ref.PhantomReference
を代替とする。
関連
-
javax.net.ssl.SSLException: 読み取りエラー: ssl=0xdeae5100: システムコール中の I/O エラー、接続 res
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] B "の印刷が "#"の印刷より劇的に遅いのはなぜですか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] ランダムな文字列を使用するこのコードは、なぜ "hello world" と表示されるのですか?
-
[解決済み] なぜJavaにはtransientフィールドがあるのですか?
-
[解決済み】なぜJavaの+=, -=, *=, /=複合代入演算子はキャスティングを必要としないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
エラー java.util.NoSuchElementException
-
[解決済み] Javaにデストラクタはありますか?
-
eclipse で「アクセス制限: タイプ 'HttpServer' は API ではありません」というプロンプトが表示される。
-
Eclipseで "XXXX "の解決策を(型に)解決することができない
-
javaの模造品QQ WeChatのチャットルーム
-
が 'X-Frame-Options' を 'deny' に設定しているため、フレーム内にある。
-
アイデア Springboot Web プロジェクトを jar にパッケージ化する場合、Error: 無効または破損した jarfile x.jar 解決策
-
Error: java.lang.NoClassDefFoundError: クラス XXXX を初期化できませんでした
-
ローカルリソースのロードが許可されていない場合の解決策
-
コミットには何も追加されないが、未追跡のファイルが存在し、gitで未追跡のファイルに対する完璧な解決策