691 Stimmen

Was ist der Sinn von "final class" in Java?

Ich lese ein Buch über Java und es sagt, dass Sie die gesamte Klasse als deklarieren können final . Ich kann mir nicht vorstellen, wo ich das verwenden würde.

Ich bin noch neu im Programmieren und frage mich wenn Programmierer dies tatsächlich in ihren Programmen verwenden . Wenn ja, wann verwenden sie es, damit ich es besser verstehen und wissen kann, wann ich es verwenden muss.

Wenn Java objektorientiert ist, und Sie eine Klasse deklarieren final Wird dadurch nicht die Idee, dass Klassen die Eigenschaften von Objekten haben, aufgegeben?

0voto

skhaapioloir Punkte 21

Abschlussklassen können nicht verlängert werden. Wenn Sie also wollen, dass sich eine Klasse auf eine bestimmte Art und Weise verhält, und nicht jemand die Methoden überschreiben will (mit möglicherweise weniger effizientem und bösartigem Code), können Sie die gesamte Klasse oder bestimmte Methoden, die nicht geändert werden sollen, als endgültig deklarieren.

Da das Deklarieren einer Klasse nicht verhindert, dass eine Klasse instanziiert wird, bedeutet dies nicht, dass die Klasse nicht mehr die Eigenschaften eines Objekts hat. Sie müssen sich nur an die Methoden halten, so wie sie in der Klasse deklariert sind.

0voto

jaamit Punkte 393

Die Android Looper-Klasse ist ein gutes praktisches Beispiel dafür. http://developer.Android.com/reference/Android/os/Looper.html

Die Klasse Looper bietet bestimmte Funktionen, die NICHT von anderen Klassen überschrieben werden sollen. Daher gibt es hier keine Unterklasse.

0voto

caduceus Punkte 1195

Die Kennzeichnung einer Klasse als final bedeutet für statische Analysetools, dass die Klasse niemals vererbt werden kann. Wenn eine Methode keine Ausnahme auslöst, die Signatur der Methode aber darauf hindeutet, hat das Werkzeug nun die Möglichkeit, Sie zu warnen oder die Methode sofort zu patchen. Solange die Klasse nicht final ist, können Sie sagen, dass eine Methode eine Ausnahme auslöst, auch wenn dies nicht der Fall ist, da es sein kann, dass eine überschreibende Methode diese Ausnahme auslösen will.

Le abstract y final Schlüsselwörter haben im Grunde den gleichen Zweck. Ich schätze, wenn sie Java von Grund auf neu schreiben müssten, würden sie wahrscheinlich eines davon als Standard wählen und nur den gegnerischen Modifikator haben.

-1voto

ericn Punkte 11488

Ich kenne nur einen konkreten Anwendungsfall: generierte Klassen

Von den Anwendungsfällen der generierten Klassen kenne ich einen: Abhängigkeit injizieren, z.B. https://github.com/google/dagger

-3voto

Wilhem Meignan Punkte 402

Bei der Objektorientierung geht es nicht um Vererbung, sondern um Verkapselung. Und Vererbung bricht die Kapselung auf.

Eine Klasse als endgültig zu deklarieren, macht in vielen Fällen durchaus Sinn. Jedes Objekt, das einen "Wert" wie eine Farbe oder einen Geldbetrag darstellt, könnte final sein. Sie stehen für sich allein.

Wenn Sie Bibliotheken schreiben, machen Sie Ihre Klassen endgültig, es sei denn, Sie rücken sie ausdrücklich als abgeleitet ein. Andernfalls können andere Ihre Klassen ableiten und Methoden überschreiben, wodurch Ihre Annahmen / Invarianten verletzt werden. Dies kann auch Auswirkungen auf die Sicherheit haben.

Joshua Bloch empfiehlt in "Effective Java", explizit für Vererbung zu entwerfen oder sie zu verbieten, und er stellt fest, dass es nicht so einfach ist, für Vererbung zu entwerfen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X