In Java ist es völlig legal, final
Argumente in Schnittstellenmethoden zu definieren und diese in der implementierenden Klasse nicht zu beachten, z.
public interface Foo {
public void foo(int bar, final int baz);
}
public class FooImpl implements Foo {
@Override
public void foo(final int bar, int baz) {
...
}
}
Im obigen Beispiel bar
und baz
hat die entgegengesetzten final
Definitionen in der Klasse VS die Schnittstelle.
Auf die gleiche Weise werden keine final
Einschränkungen erzwungen, wenn eine Klassenmethode eine andere erweitert abstract
oder nicht.
Während final
einigen praktischen Wert innerhalb der Klassenmethode Körper hat, gibt es eine Stelle spezifiziert final
für Schnittstellenmethodenparameter?
final
macht sowieso nichts mit nativen Typen, da sie kopiert werden.interface
Definitionen nur imfinal
Attribut eines Arguments variieren , sind die resultierenden.class
Dateien Byte für Byte identisch (undjavap -v
erzeugen natürlich dieselbe Ausgabe). Das gleiche gilt übrigens für zwei Klassen, die sich nur infinal
einem Attribut unterscheiden !Antworten:
Es scheint keinen Sinn zu haben. Gemäß der Java-Sprachspezifikation 4.12.4 :
Ein
final
Modifikator für einen Methodenparameter wird jedoch in den Regeln für den Abgleich von Signaturen überschriebener Methoden nicht erwähnt und hat keine Auswirkungen auf den Aufrufer, nur innerhalb des Hauptteils einer Implementierung. Wie Robin in einem Kommentar bemerkt hat, hat derfinal
Modifikator für einen Methodenparameter keine Auswirkung auf den generierten Bytecode. (Dies gilt nicht für andere Verwendungen vonfinal
.)quelle
final
nahezu nutzlos, da der Modifikator der implementierenden Klasse nicht erzwungen wird. Ihre Schnittstellensignatur kann einfach lügen.Einige IDEs kopieren die Signatur der Abstract- / Interface-Methode, wenn eine Implementierungsmethode in eine Unterklasse eingefügt wird.
Ich glaube nicht, dass es für den Compiler einen Unterschied macht.
EDIT: Obwohl ich glaube, dass dies in der Vergangenheit der Fall war, glaube ich nicht, dass aktuelle IDEs dies mehr tun.
quelle
static transient
Felder. ;)Abschließende Anmerkungen zu Methodenparametern sind immer nur für die Methodenimplementierung relevant, niemals für den Aufrufer. Daher gibt es keinen wirklichen Grund, sie in Signaturen von Schnittstellenmethoden zu verwenden. Es sei denn, Sie möchten in allen Methodensignaturen denselben konsistenten Codierungsstandard befolgen, für den endgültige Methodenparameter erforderlich sind. Dann ist es schön, das zu können.
quelle
Update: Die ursprüngliche Antwort unten wurde geschrieben, ohne die Frage vollständig zu verstehen, und geht daher nicht direkt auf die Frage ein.
:)
Dennoch muss sie für diejenigen informativ sein, die die allgemeine Verwendung von verstehen möchtenfinal
Schlüsselwörtern möchten.Zu der Frage möchte ich meinen eigenen Kommentar von unten zitieren.
Ich kann mir zwei Gründe vorstellen, warum eine Methodensignatur
final
Parameter haben kann: Beans und Objekte ( Eigentlich sind beide der gleiche Grund, aber leicht unterschiedliche Kontexte. )Objekte:
Das
final
Schlüsselwort stellte sicher, dass wir nicht versehentlich einen neuen lokalen Kochtopf erstellen, indem bei diesem Versuch ein Kompilierungsfehler angezeigt wurde. Dies stellte sicher, dass die Hühnerbrühe in unseren ursprünglichen Kochtopf gegeben wurde, den dieaddChicken
Methode erhielt. Vergleichen Sie dies mit der Stelle,addVegetables
an der wir den Blumenkohl verloren haben, weil er diesen anstelle des ursprünglichen Topfes in einen neuen lokalen Kochtopf gegeben hat.Bohnen: Es ist das gleiche Konzept wie bei Objekten (wie oben gezeigt) . Bohnen sind im Wesentlichen
Object
s in Java. Beans (JavaBeans) werden jedoch in verschiedenen Anwendungen verwendet, um eine definierte Sammlung verwandter Daten bequem zu speichern und weiterzugeben. So wie dasaddVegetables
den Kochprozess durcheinander bringen könnte, indem ein neuer Kochtopf erstelltStringBuilder
und mit dem Blumenkohl weggeworfen wird, könnte dies auch mit einem Kochtopf JavaBean geschehen .quelle
final
in der Schnittstelle deklarieren können, es aber in der Implementierung nicht endgültig haben . Es wäre sinnvoller gewesen, wenn entweder (a) dasfinal
Schlüsselwort für Argumente der Schnittstellenmethode (abstrakt) nicht zulässig wäre (Sie können es jedoch in der Implementierung verwenden) oder (b) das Deklarieren eines Arguments wiefinal
in der Schnittstelle das Deklarierenfinal
in der Implementierung erzwingen würde (aber nicht für Nicht-Finale gezwungen).:)
Ich glaube, es kann ein überflüssiges Detail sein, denn ob es endgültig ist oder nicht, ist ein Implementierungsdetail.
(So ähnlich wie das Deklarieren von Methoden / Mitgliedern in einer Schnittstelle als öffentlich.)
quelle