Pourquoi la méthode finalize() en java.lang.Objet “protégés”?

Par curiosité,

Pourquoi le finalize() méthode de modificateur d'accès est faite comme protected. Pourquoi ne peux-il être public? Quelqu'un peut-il m'expliquer une raison derrière tout cela?

Aussi, je suis venu pour savoir que finalize() méthode est appelée qu'une seule fois. Si je l'appelle deux fois dans mon programme en interne, ce qui se passe? Sera le garbage collector appel de ce nouveau?

private void dummyCall() {
    try {
        finalize();
        finalize();
    } catch (Throwable e) {
        e.printStackTrace();//NOT REACHES EXCEPTION
    }
}
  • pourquoi voulez-vous écrire une méthode à invoquer finalize(). finalize() est invoquée à l'exemple de la destruction par la JVM. vous ne devriez pas l'invoquer. Vous pouvez la remplacer si, dans le cas où vous voulez un comportement particulier à la destruction du temps...
  • Oui. Personnellement, je ne ferais jamais cela. Mais j'ai demandé par curiosité depuis que j'ai lu GC coutume de l'appeler si sa déjà appelée sur un objet. Qui est de garder la trace de savoir si cette méthode finalize() est appelée ou non est ce que mon doute. Je n'ai pas une explication convaincante à cette deuxième question.
  • La vraie question intéressante est: pourquoi est-finalize() présente dans la partie supérieure de la Java OO hiérarchie? 200K LOC projet ici et nous n'avons pas remplacé finalize() une seule fois. Certains vont jusqu'à dire que c'est une odeur de code pour remplacer finalize() et certains hérétiques serait aller aussi loin que de dire que finalize() n'existe pas à l'OOA/OOD niveau et que sa présence au sommet de la Java de la hiérarchie est un (cassé) Java idiosynchrasy (et complètement étrangers à votre espace-problème). Tout à fait certains de la upvoted réponses ici btw envisager finalize() pour être cassée ou défectueuse d'une manière ou d'une autre 🙂
  • Seuls les experts en Java devraient être aller n'importe où près de finalize().
  • "GC coutume de l'appeler si sa déjà appelée sur un objet. Qui est de garder la trace de savoir si cette méthode finalize() est appelée ou non ..." Err, GC est de garder la trace? Et une fois que l'objet tombe entre les mains de les GC vous n'avez pas une façon d'attirer l'finalize() de vous-même. Vraiment votre question n'a aucun sens.
  • "La vraie question intéressante est: pourquoi est-finalize() présente dans la partie supérieure de la Java OO hiérarchie?' Euh, donc, GC peut appeler ça sur n'importe quel objet?
  • Juste parce que vous voudrez peut-être appeler finalize() sur certains objets, ne signifie pas qu'ils ont tous besoin. Comment sur une interface et si vous voulez que le GC à l'appel, vous pouvez dire implements finalize sur votre classe. Aussi, la seule chose que vous devriez être en mesure de faire à finaliser est le journal que certains membre de la variable != null parce que quelqu'un n'a pas écrit le bon finally bloc.

InformationsquelleAutor bragboy | 2010-02-18