Bruce Eckel のThinking in Java 4th editionにゆっくりと取り組んでいますが、次の問題に悩まされています。
メッセージを出力する finalize( ) メソッドを持つクラスを作成します。main( ) で、クラスのオブジェクトを作成します。finalize( ) が常に呼び出されるように、前の演習を変更します。
これは私がコーディングしたものです:
public class Horse {
boolean inStable;
Horse(boolean in){
inStable = in;
}
public void finalize(){
if (!inStable) System.out.print("Error: A horse is out of its stable!");
}
}
public class MainWindow {
public static void main(String[] args) {
Horse h = new Horse(false);
h = new Horse(true);
System.gc();
}
}
ブール値が に設定された新しいHorse
オブジェクトを作成します。ここで、メソッド内で が であるかどうかを確認します。そうであれば、メッセージを出力します。inStable
false
finalize()
inStable
false
残念ながら、メッセージは印刷されません。条件が に評価されるので、そもそも呼び出されていないとtrue
思います。finalize()
プログラムを何度も実行しましたが、エラー メッセージが表示されるのは数回だけでした。System.gc()
が呼び出されると、ガベージ コレクターは参照されていないオブジェクトを収集するという印象を受けました。
正解をグーグルで検索すると、このリンクが表示されました。これにより、より詳細で複雑なコードが得られます。、 、などSystem.runFinalization()
、これまでに見たことのないメソッドを使用します。Runtime.getRuntime()
System.runFinalizersOnExit()
どのように機能するか、強制的に実行する方法をよりよく理解できる人はfinalize()
いますか? または、ソリューション コードで行われていることを順を追って説明してくれますか?