endgültiges Schlüsselwort in Methodenparametern

Ich begegne oft Methoden, die wie folgt aussehen:

public void foo(final String a, final int[] b, final Object1 c){ } 

Was passiert, wenn diese Methode aufgerufen wird, ohne die letzten Parameter zu übergeben? dh ein Object1, das später geändert wird (also nicht als final deklariert wird), kann an diese Methode übergeben werden

Solutions Collecting From Web of "endgültiges Schlüsselwort in Methodenparametern"

Java erstellt immer eine Kopie der Parameter, bevor sie an Methoden gesendet werden. Dies bedeutet, dass das Finale keinen Unterschied für den aufrufenden Code bedeutet. Dies bedeutet nur, dass die Variablen innerhalb der Methode nicht neu zugewiesen werden können. (Beachten Sie, dass Sie, wenn Sie ein endgültiges Objekt haben, die Attribute des Objekts noch ändern können).

Es gibt einen Umstand, bei dem Sie es als endgültig deklarieren müssen – andernfalls wird es zu einem Kompilierungserrors kommen -, nämlich sie in anonyme classn weiterzuleiten. Grundbeispiel:

 public FileFilter createFileExtensionFilter(final String extension) { FileFilter fileFilter = new FileFilter() { public boolean accept(File pathname) { return pathname.getName().endsWith(extension); } }; // What would happen when it's allowed to change extension here? // extension = "foo"; return fileFilter; } 

Das Entfernen des final Modifikators würde zu einem Kompilierungserrors führen, da nicht mehr garantiert ist, dass der Wert eine Laufzeitkonstante ist. Wenn Sie den Wert von außerhalb der anonymen class ändern, würde dies dazu führen, dass sich die anonyme classninstanz nach dem Zeitpunkt der Erstellung anders verhält.

Java ist nur pass-by-value. (oder besser – pass-reference-by-value)

Das übergebene Argument und das Argument innerhalb der Methode sind also zwei verschiedene Handler, die auf dasselbe Objekt (Wert) zeigen.

Wenn Sie den Status des Objekts ändern, wird es daher in jeder anderen Variablen widergespiegelt, die darauf verweist. Wenn Sie dem Argument jedoch ein neues Objekt (Wert) zuweisen, werden andere Variablen, die auf dieses Objekt (Wert) verweisen, nicht neu zugewiesen.

Das final Schlüsselwort eines Methodenparameters bedeutet für den Aufrufer absolut nichts. Es bedeutet auch absolut nichts für das laufende Programm, da seine Anwesenheit oder Abwesenheit den Bytecode nicht ändert. Es stellt nur sicher, dass der Compiler sich beschweren wird, wenn die Parametervariable innerhalb der Methode neu zugewiesen wird. Das ist alles. Aber das ist genug.

Einige Programmierer (wie ich) denken, dass das eine sehr gute Sache ist und verwenden fast alle Parameter. Es macht es einfacher, eine lange oder komplexe Methode zu verstehen (obwohl man argumentieren könnte, dass lange und komplexe Methoden umstrukturiert werden sollten). Es beleuchtet auch Methodenparameter, die nicht als final markiert sind.

Betrachten Sie diese Implementierung von foo ():

 public void foo(final String a) { SwingUtilities.invokeLater(new Runnable() { public void run() { System.out.print(a); } }); } 

Da die Runnable Instanz die Methode überlebte, würde sie ohne das final Schlüsselwort nicht kompiliert werden – final sagt dem Compiler, dass es sicher ist, eine Kopie der Referenz zu erstellen (um später darauf zu verweisen). Somit ist es die Referenz , die als endgültig betrachtet wird, nicht der Wert . Mit anderen Worten: Als Anrufer können Sie nichts kaputt machen …

Wenn Sie einen Parameter als final deklarieren, können Sie dessen Wert nicht ändern.

 class Bike11 { int cube(final int n) { n=n+2;//can't be changed as n is final n*n*n; } public static void main(String args[]) { Bike11 b=new Bike11(); b.cube(5); } } 

Ausgabe: Kompilierzeiterrors

Für weitere Details besuchen Sie bitte meinen Blog: http://javabyroopam.blogspot.com

final bedeutet, dass Sie den Wert dieser Variablen nach der Zuweisung nicht mehr ändern können.

In der Zwischenzeit bedeutet die Verwendung von final für die Argumente in diesen Methoden, dass der Programmierer seinen Wert während der Ausführung der Methode nicht ändern kann . Dies bedeutet nur, dass innerhalb der Methode die endgültigen Variablen nicht neu zugewiesen werden können.

@stuXnet, ich könnte genau das Gegenteil argumentieren. Wenn Sie ein Objekt an eine function übergeben und die Eigenschaften des übergebenen Objekts ändern, wird der Aufrufer der function den geänderten Wert in seiner Variablen sehen. Dies impliziert ein Referenzsystem, das nicht nach Wert besteht.

Was verwirrend ist, ist die Definition von “Übergabe als Wert” oder “Übergabe als Verweis” in einem System, bei dem die Verwendung von pointersn für den Endbenutzer vollständig verborgen ist.

Java ist definitiv kein Wert, denn das würde bedeuten, dass man das übergebene Objekt mutieren könnte und das Original wäre davon nicht betroffen.

Beachten Sie, dass Sie Grundelemente nicht mutieren können, die Sie nur Variablen zuweisen können. Das Testen eines Durchlaufs als Referenz oder als Wert mithilfe von Primitiven ist kein Test.

Was Sie in Java nicht tun können, was in anderen Sprachen möglich ist, besteht darin, die Variablen des Aufrufers einem neuen Wert zuzuordnen, da es in Java keine pointers gibt, was das Ganze verwirrend macht.

Das finale Schlüsselwort im Methodeneingabeparameter wird nicht benötigt. Java erstellt eine Kopie des Verweises auf das Objekt. Wenn Sie also endgültig festlegen, wird das Objekt nicht endgültig, sondern nur die Referenz, was keinen Sinn ergibt

Fast alles wurde über die final Methodenparameter in Java gesagt; aber ich würde gerne eine kleine einfache Sache hinzufügen, die Sie sich diesen final Methodenparameter wie const Pass-by-Reference-Parameter in C++ wie => vorstellen können

 void someMethod(const int* param1) { ... } 

Strings sind unveränderlich, daher können Sie den String danach nicht ändern (Sie können die Variable, die den String-Objektpunkt enthielt, nur auf ein anderes String-Objekt setzen).

Dies ist jedoch nicht der Grund, warum Sie eine beliebige Variable an einen final Parameter binden können. Bei allen Compiler-Prüfungen wird der Parameter in der Methode nicht neu zugewiesen. Dies ist gut für Dokumentationszwecke, wohl einen guten Stil, und kann sogar helfen, den Byte-Code für die Geschwindigkeit zu optimieren (obwohl dies in der Praxis nicht viel zu tun scheint).

Aber selbst wenn Sie einen Parameter innerhalb einer Methode neu zuweisen, merkt der Aufrufer das nicht, da Java alle Parameter als Wert übergeben kann. Nach der Sequenz

  a = someObject(); process(a); 

Die Felder von a können sich geändert haben, aber a ist immer noch dasselbe Objekt wie zuvor. In Pass-by-Reference-Sprachen ist dies möglicherweise nicht richtig.