Comment assurer finalize() est toujours appelé (Penser en Java exercice)

Je suis en train, lentement, par Bruce Eckel de Penser en Java 4ème édition, et le problème suivant a moi perplexe:

Créer une classe avec une méthode finalize( ) qui affiche un message. Dans main( ), créez un objet de votre classe. Modifier l'exercice précédent, de sorte que votre finalize( ) sera toujours appelé.

C'est ce que j'ai codé:

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();
    }
}

Il crée un nouveau Horse objet avec l'opérateur booléen inStable ensemble de false. Maintenant, dans le finalize() méthode, il vérifie pour voir si inStable est false. Si elle l'est, il imprime un message.

Malheureusement, aucun message n'est imprimé. Puisque la condition est évaluée à true, ma conjecture est que finalize() n'est pas appelée en premier lieu. J'ai exécuter le programme à de nombreuses reprises, et ont vu le message d'erreur d'impression seulement une couple de fois. J'étais sous l'impression que quand System.gc() est appelé, le garbage collector de recueillir tous les objets qui ne sont pas référencées.

Googler une bonne réponse m'a donné ce lien, ce qui donne beaucoup plus détaillée, code compliqué. Il utilise des méthodes que je n'ai pas vu avant, comme System.runFinalization(), Runtime.getRuntime(), et System.runFinalizersOnExit().

Est ce que quelqu'un pourrez me donner une meilleure compréhension de la façon dont finalize() fonctionne et comment le forcer à exécuter, ou de me guider à travers ce qui est fait dans la solution de code?

"J'étais sous l'impression que lorsque le Système.gc() est appelée, le garbage collector de recueillir tous les objets qui ne sont pas référencées" Dans votre cas, il y a est en fait une référence de votre objet, alors pourquoi devrait-il être détruit? Aussi, je ne pense pas que c'est garanti que System.gc() fait recycle quoi que ce soit.
Sur la ligne h = new Horse(true); j'ai mis h pour un nouvel objet, ce qui le précédent (qui avait inStable false) non référencées.
Ouais, dans ce cas, consulter la deuxième moitié de mon commentaire. Il n'y a pas de garanties. La solution à partir de cette page externe est en fait pas une vraie solution

OriginalL'auteur MattDs17 | 2012-08-19