Wie bereits erwähnt, final
wird es mit einer Java-Methode verwendet, um zu markieren, dass die Methode nicht überschrieben (für den Objektbereich) oder ausgeblendet (für statisch) werden kann. Auf diese Weise kann der ursprüngliche Entwickler Funktionen erstellen, die von Unterklassen nicht geändert werden können. Dies ist die gesamte Garantie, die er bietet.
Dies bedeutet, dass die Funktionalität der endgültigen Methode möglicherweise noch anpassbar ist, wenn die Methode auf anderen anpassbaren Komponenten wie nicht öffentlichen Feldern / Methoden basiert. Dies ist jedoch gut, da es (mit Polymorphismus) eine teilweise Anpassung ermöglicht.
Es gibt eine Reihe von Gründen, die verhindern, dass etwas anpassbar ist, darunter:
Leistung - Einige Compiler können den Betrieb analysieren und optimieren, insbesondere der ohne Nebenwirkungen.
Erhalten Sie gekapselte Daten - sehen Sie sich unveränderliche Objekte an, deren Attribute zum Zeitpunkt der Erstellung festgelegt wurden und niemals geändert werden sollten. Oder ein berechneter Wert, der aus diesen Attributen abgeleitet wird. Ein gutes Beispiel ist die Java- String
Klasse.
Zuverlässigkeit und Contract - Objekte sind aus Primitiven zusammengesetzt ( int
, char
, double
, usw.) und / oder anderen Objekten. Nicht alle Operationen, die auf diese Komponenten anwendbar sind, sollten anwendbar oder sogar logisch sein, wenn sie im größeren Objekt verwendet werden. Methoden mit dem final
Modifikator können verwendet werden, um dies sicherzustellen. Die Counter-Klasse ist ein gutes Beispiel.
public class Counter {
private int counter = 0;
public final int count() {
return counter++;
}
public final int reset() {
return (counter = 0);
}
}
Wenn die public final int count()
Methode nicht ist final
, können wir so etwas tun:
Counter c = new Counter() {
public int count() {
super.count();
return super.count();
}
}
c.count(); // now count 2
Oder sowas:
Counter c = new Counter() {
public int count() {
int lastCount = 0;
for (int i = super.count(); --i >= 0; ) {
lastCount = super.count();
}
return lastCount;
}
}
c.count(); // Now double count
Zunächst können Sie nicht abstrakte Klassen
final
sowie Felder und Methoden markieren . Auf diese Weise kann die gesamte Klasse nicht in Unterklassen unterteilt werden. Das Verhalten der Klasse wird also behoben.Ich bin damit einverstanden, dass Markierungsmethoden
final
nicht garantieren, dass ihr Verhalten in Unterklassen gleich ist, wenn diese Methoden nicht endgültige Methoden aufrufen. Wenn das Verhalten tatsächlich behoben werden muss, muss dies durch Konvention und sorgfältiges Design erreicht werden. Und vergessen Sie nicht, dies in Javadoc zu verstehen! (Java-Dokumentation)Last but not least spielt das
final
Schlüsselwort im Java Memory Model (JMM) eine sehr wichtige Rolle. JMM garantiert, dassfinal
Sie keine ordnungsgemäße Synchronisierung benötigen , um die Sichtbarkeit von Feldern zu erreichen . Z.B:quelle
String
, aber in benutzerdefinierten Klassen). Aber was Sie über "final garantiert das Verhalten nicht" gesagt haben, ist genau mein Punkt. Ich stimme zu, Doc und Design sind wichtig.final
die Sichtbarkeit von Änderungen, die an zusammengesetzten Objekten vorgenommen wurden, wie zMap
.Ich bin mir nicht sicher, ob Sie Aussagen über die Verwendung von "final" machen können und wie sich dies auf den gesamten Designvertrag der Software auswirkt. Sie können sicher sein, dass kein Entwickler diese Methode überschreiben und seinen Vertrag auf diese Weise ungültig machen kann. Andererseits kann die endgültige Methode auf Klassen- oder Instanzvariablen beruhen, deren Werte durch Unterklassen festgelegt werden, und andere Klassenmethoden aufrufen, die überschrieben werden. Das Finale ist also höchstens eine sehr schwache Garantie.
quelle
const
. Wie inchar const * const = "Hello"
oderchar const * const addName(char const * const name) const
...Nein, es liegt nicht außerhalb des Einflusses des Klassenautors. Sie können es in Ihrer abgeleiteten Klasse nicht überschreiben, daher wird es das tun, was der Autor der Basisklasse beabsichtigt hat.
http://download.oracle.com/javase/tutorial/java/IandI/final.html
Bemerkenswert ist der Teil, in dem vorgeschlagen wird, Methoden zu verwenden, die von Konstruktoren aufgerufen werden
final
.quelle