Warum ist die finalize () Methode in java.lang.Object "protected"?
Aus Neugier,
Warum ist die finalize()
Methode Zugriff Modifikator wird als protected
. Warum kann es sein public
? Kann jemand erklären mir irgendeinen bestimmten Grund dafür?
Auch, ich kam zu wissen, dass finalize()
- Methode nur einmal aufgerufen wird. Wenn ich rufe, es zweimal in meinem Programm intern, was ist passiert? Wird der garbage collector aufrufen, diese wieder?
private void dummyCall() {
try {
finalize();
finalize();
} catch (Throwable e) {
e.printStackTrace();//NOT REACHES EXCEPTION
}
}
InformationsquelleAutor der Frage bragboy | 2010-02-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beantworte ich Ihre Frage mit einer anderen Frage:
Im Allgemeinen sollten Sie versuchen, die Dinge so viel privat wie möglich. Das ist es, was die Kapselung. Ansonsten könnten Sie machen alles
public
.finalize
können nichtprivate
(da abgeleitete Klassen sollten in der Lage sein, um Zugriff auf Sie zu in der Lage sein, um es zu überschreiben), so sollte es zumindest seinprotected
aber warum geben Sie mehr zugreifen, wenn es nicht wünschenswert?Nach der Lektüre Ihr Kommentar, genauer, ich denke, ich sehe Ihr Haupt nun hin. Ich denke, dein Punkt ist da alles stammt aus
java.lang.Object
und daher greift seineprotected
Mitglieder, es würde keinen Unterschied machen für Sie (oder jede Methode, die injava.lang.Object
für diese Angelegenheit) zupublic
im Gegensatz zuprotected
. Ich persönlich zähle das als einen Designfehler in Java. Dieser ist zwar Fix in C#. Das problem ist nicht, warumfinalize
geschützt ist. Das ist OK. Das eigentliche Problem ist, dass Sie sollten nicht in der Lage, um geschützte Methoden in der Basis-Klasse durch eine Referenz auf ein Objekt der Basisklasse geben. Eric Lippert hat eine Blogeintrag der Diskussion, warum eine solche Art von Zugriff auf protected-Elemente ist eine schlechte Idee, die ist weiter ausgearbeitet Stack-Überlauf, der in dieser Frage.InformationsquelleAutor der Antwort Mehrdad Afshari
Es ist nicht öffentlich, da sollte es nicht aufgerufen werden, die von anderen Personen als der JVM. Es muss aber geschützt werden, damit es kann von Unterklassen überschrieben werden müssen, und definiert das Verhalten für Sie.
Können Sie es nennen wie Sie wollen, es ist nur eine Methode, nachdem alle. Jedoch, ähnlich wie
public static void main(String [] args)
hat es eine Besondere Bedeutung für die JVMJa
InformationsquelleAutor der Antwort Kevin
Rant gegen finalize()
Vorsicht Fehler in der obigen Aussagen, ich bin ein bisschen müde 🙂
InformationsquelleAutor der Antwort josefx
Check-out dieser link erläutert.
Grundsätzlich, es würde am meisten Sinn machen für Sie zu sein
private
wie es sollte nur aufgerufen werden, indem Sie die JVM (garbage collector). Aber um das zu erlauben einer Unterklasse aufrufen, die Elternfinalize()
- Methode als Teil Ihrerfinalize()
ist zuprotected
.(Bearbeiten - Und nur eine Allgemeine Vorsicht - die Verwendung der finalize () - Methode wird allgemein abgeraten, da es keine Möglichkeit sicherzustellen, dass es jemals aufgerufen werden. Obwohl das bedeutet nicht, dass Sie nie Gelegenheit haben, es zu benutzen - es ist nur selten.)
InformationsquelleAutor der Antwort froadie
Den Teil über
finalize()
wird nur einmal aufgerufen werden, bezieht sich nur auf die Anrufe von der GC. Sie können sich vorstellen, das Objekt als ein versteckt-flag "finalize()
wurde von den GC", und die GC-Prüfung, die Flagge zu wissen, was zu tun mit dem Objekt. Das flag wird nicht beeinflusst in keiner Weise durch Ihre eigenen handgefertigten Aufrufefinalize()
.Auf Fertigstellung, Lesen dieser Artikel von Hans Boehm (wer ist bekannt für seine Arbeit auf die garbage collection). Dies ist ein eye-opener über finalization; insbesondere, Boehm erklärt, warum die Fertigstellung ist notwendigerweise asynchron. Eine logische Folge ist, dass während der Finalisierung ist ein leistungsfähiges Werkzeug, es ist sehr selten das richtige Werkzeug für eine bestimmte Aufgabe.
InformationsquelleAutor der Antwort Thomas Pornin
Es ist nicht
public
(oder Standard-Zugang), weil es soll aufgerufen werden, indem Sie die JVM-intern, wenn das Objekt von der garbage Collection eingesammelt - es ist nicht gedacht, genannt zu werden, durch nichts anderes. Und es ist nichtprivate
denn es soll überschrieben werden, und Sie kann nicht außer Kraft gesetzt private Methoden.Wahrscheinlich ja, aber es ist schwer eine Situation vorstellen, wo dies würde jede Art von Sinn - der Punkt der
finalize()
ist nicht Aufräumen, wenn ein Objekt bei der Speicherbereinigung. Und ist es nicht sogar gut tun, so es ist wirklich etwas, was Sie vermeiden sollten insgesamt eher als experiment mit.InformationsquelleAutor der Antwort Michael Borgwardt
finalize() ist nur die JVM um die Ressourcen zu bereinigen, wenn das Objekt erfasst werden. Es ist vernünftig, für eine Klasse zu definieren, welche Maßnahmen ergriffen werden sollten, über die Sammlung, die Sie benötigen, um Zugang super.finalize(). Es macht nicht wirklich Sinn machen, einen außen-Prozess aufrufen, finalize(), da ein externe Prozess nicht Steuern kann, Wann das Objekt gesammelt werden.
InformationsquelleAutor der Antwort Steve B.
Wahrscheinlich Fragen Sie dies unter dem Eindruck, den der C++ - ~Destruktoren. In java finalize () - Methode nicht jede Magie (wie clearing-Speicher). Es soll aufgerufen werden durch den garbage collector. Aber nicht Umgekehrt.
Empfehle ich Ihnen, Lesen Sie entsprechendes Kapitel in Joshua Bloch ' s "Effective Java". Es sagt, dass die Verwendung von Finalizer ist eine schlechte Praxis und kann dazu führen, dass performance-und andere Probleme, und es gibt nur einige Fälle, wenn Sie verwendet werden sollten. Das Kapitel beginnt mit den nächsten Worten:
InformationsquelleAutor der Antwort Roman
Ich denke, der Grund, warum
finalize
geschützt ist, wäre dass es vielleicht überschrieben, die von einigen Klassen im JDK, und diese überschriebenen Methoden aufgerufen werden durch die JVM.InformationsquelleAutor der Antwort meerut