Privat und endgültig?

F: Angesichts dessen:

  • private Methoden können nicht von Unterklassen überschrieben werden
  • final Methoden können nicht von Unterklassen überschrieben werden
  • final Methoden ermöglichen schnelleren Code beim Kompilieren mit aktivierten Optimierungen (javac -O)

Meine Fragen sind:

  1. Warum nicht auch alle privateMethoden deklarieren final?
  2. Behandeln die meisten Compiler privateMethoden als final?

A: Wie Sie hervorheben, können Unterklassen privateMethoden nicht vom Design her überschreiben . Darüber hinaus finalteilt das Schlüsselwort dem Compiler mit, dass Unterklassen eine Methode unabhängig von ihrer Zugriffsebene möglicherweise nicht überschreiben. Da dies privatebereits impliziert, dass eine Unterklasse eine Methode möglicherweise nicht überschreibt, ist die Deklaration einer privateMethode als finalredundant. Das Abgeben der Deklaration verursacht keine Probleme, führt aber auch zu nichts, da privates automatisch berücksichtigt werden final.

Nun, die Praxis, alle privateMethoden zu deklarieren , finalhat einen Nebeneffekt. Jeder unerfahrene Java-Programmierer, der auf Ihren Code stößt, wird Ihre Verwendung von assimilieren private finalund denkt, dass privates auf diese Weise deklariert werden muss. So können Sie beurteilen, wer Kontakt zu Ihrem Code hat und wer nicht. Es könnte sich als interessante Übung erweisen.

Um Frage 1 zu beantworten, müssen keine privateMitglieder deklariert werden final.

In Frage 2 können ein optimierender Compiler und eine JVM privateMethoden und finalMethoden nutzen. Da Unterklassen diese Typen möglicherweise nicht überschreiben, muss zur Laufzeit keine dynamische Bindung durchgeführt werden. Unterklassen überschreiben die Methode niemals, sodass die Laufzeit immer weiß, welche Methode aufgerufen werden muss, ohne die Vererbungshierarchie zu durchsuchen. Während der Kompilierung kann ein optimierender Compiler sogar alle privateund finalMethoden inline setzen , um die Leistung zu verbessern.

Um Frage 2 zu beantworten: Ja, alle Compiler behandeln privateMethoden als final. Der Compiler lässt nicht zu, dass eine privateMethode überschrieben wird. Ebenso verhindern alle Compiler, dass Unterklassen finalMethoden überschreiben .

Eine interessantere Frage: Optimieren alle Compiler finals und privates so, dass sie inline sind? Die kurze Antwort lautet nein. Das Optimierungsverhalten hängt vom Compiler und seinen Einstellungen ab.

Hinweis: Unsere Diskussion über das private Finale gilt nur für Methoden. Private endgültige Mitgliedsvariablen werden unterschiedlich behandelt

Erfahren Sie mehr über dieses Thema

  • Mehr wollen? Den vollständigen Q & A-Katalog finden Sie im Java Q & A- Index

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

Diese Geschichte "Privat und endgültig?" wurde ursprünglich von JavaWorld veröffentlicht.