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