Frage

    

Diese Frage bereits eine Antwort hier:

         

ich oft auf Methoden, die wie folgt aussehen:

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

Was passiert, wenn diese Methode ohne Leiten endgültige Parameter aufgerufen. das heißt ein Object1, die später geändert wird, kann (so wird nicht als final deklariert) zu dieser Methode ganz gut übergeben werden

War es hilfreich?

Lösung

Java macht immer eine Kopie von Parametern, bevor sie an Methoden senden. Dies bedeutet, das letzte bedeutet keinen Unterschied für den anrufenden Code. Das bedeutet nur, dass die Variablen in der Methode nicht neu zugewiesen werden. (Beachten Sie, dass ein endgültiges Objekt haben, können Sie immer noch die Attribute des Objekts ändern).

Andere Tipps

Es ist ein Umstand, wo Sie erforderlich es endgültig --otherwise erklären es in der Kompilierung error-- führen wird, nämlich sie durch Klassen in anonyme vorbei. Einfaches Beispiel:

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 final Modifikator Entfernen würde in der Kompilierung Fehler führen, weil es nicht mehr gewährleistet ist, dass der Wert einer Laufzeit konstant ist. Das Ändern des Wertes von außerhalb der anonymen Klasse würde nämlich Sache der anonyme Klasseninstanz verhalten unterschiedlich nach dem Zeitpunkt der Schöpfung.

Java ist nur Pass-by-Wert. (Oder besser - Pass-Referenz-by-Wert)

So das übergebene Argument und das Argument innerhalb des Verfahrens ist zwei zeigen Handler auf das gleiche Objekt (Wert).

Wenn Sie also Ändern Sie den Status des Objekts wird zu jeder anderen Variable reflektiert, die es referenziert wird. Aber wenn Sie neu zuweisen ein neues Objekt (Wert) auf das Argument, dann werden andere Variablen auf dieses Objekt zeigen (Wert) nicht bekommen, erneut zugewiesen.

Das final Schlüsselwort auf einem Methodenparameter Mittel absolut nichts mit dem Anrufer. Es bedeutet auch, absolut nichts zu dem laufenden Programm, da seine Anwesenheit oder Abwesenheit nicht den Bytecode nicht ändert. Es stellt nur sicher, dass der Compiler wird sich beschweren, wenn der Parameter Variable innerhalb der Methode zugewiesen wird. Das ist alles. Aber das ist genug.

Einige Programmierer (wie ich) denken, das ist eine sehr gute Sache und Verwendung final auf fast jedem Parameter. Es macht es einfacher, ein langes oder komplexes Verfahren zu verstehen (wenn man so lange und komplexe Methoden Refactoring werden könnte argumentieren.) Es scheint auch ein Schlaglicht auf Methodenparameter, die nicht markiert mit final.

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 überleben würde, wäre dies ohne das final Schlüsselwort nicht kompilieren - final sagt der Compiler, dass es sicher ist, eine Kopie der Referenz zu nehmen (bis darauf verweist später). Daher ist es der Hinweis , die als endgültig betrachtet haben, nicht der Wert . Mit anderen Worten: Als Anrufer können Sie nicht durcheinander etwas nach oben ...

letzte Sie können also nicht den Wert dieser Variablen ändern, sobald es zugewiesen wurde.

Inzwischen hat die Verwendung von letzten für die Argumente in diesen Methoden mittels es wird nicht dem Programmierer erlaubt ihren Wert während der Durchführung des Verfahrens zu ändern . Dies bedeutet nur, dass innerhalb der Methode der letzte Variablen können nicht neu zugewiesen werden.

Wenn Sie einen beliebigen Parameter als final deklarieren, können Sie den Wert nicht geändert werden.

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: Compile Zeitfehler

Weitere Informationen finden Sie in meinem Blog unter: http://javabyroopam.blogspot.com

Strings unveränderlich sind, so actully können Sie nicht den String danach ändern (Sie können nur die Variable machen, die den String-Objekt Punkt zu einem anderen String-Objekt gehalten werden).

Das ist aber nicht der Grund, warum Sie eine Variable auf einen final Parameter binden können. Alle der Compiler überprüft ist, dass der Parameter nicht neu zugewiesen wird in die Methode. Dies ist für die Dokumentation gut, wohl guten Stil, und kann sogar der Byte-Code für Geschwindigkeit Hilfe optimize (obwohl dies scheint nicht sehr viel in der Praxis zu tun).

Aber auch wenn Sie innerhalb einer Methode einen Parameter tun neu zuweisen, wird der Anrufer nicht bemerken, weil Java tut alle Parameter als Wert übergeben. Nach der Sequenz

  a = someObject();
  process(a);

Die Felder eines haben sich geändert, aber eine ist immer noch das gleiche Objekt, das es vorher war. Im Pass-by-reference Sprachen dies nicht der Fall sein kann.

@stuXnet, konnte ich das genaue Gegenteil Argument machen. Wenn Sie ein Objekt an eine Funktion, und legen Sie die Eigenschaften des übergebenen Objekts zu ändern dann die Aufrufer der Funktion wird der geänderte Wert in der Variable sehen. Dies impliziert einen Pass mit dem Bezugssystem, nicht als Wert übergeben.

Was ist verwirrend ist die Definition von Pass von Wert oder Pass durch Bezugnahme in einem System, in dem die Verwendung von Zeigern vollständig an die Endbenutzer verborgen ist.

Java ist definitiv nicht von Wert übergeben, als solche zu sein, bedeuten würde man das übergebene Objekt mutieren könnte und das Original wäre nicht betroffen.

Beachten Sie nicht mutieren Primitiven können Sie sie nur Variablen zuweisen. So testet ein Übergeben durch Verweis oder durch Wert von Primitiven verwendet, ist kein Test.

Was können Sie in Java nicht tun, die in anderen Sprachen durchgeführt werden kann, ist die Anrufer Variablen auf einen neuen Wert zuzuweisen, weil es keine Zeiger in Java sind, so das macht es verwirrend.

final Schlüsselwort in der Methode Eingabeparameter ist nicht erforderlich. Java erstellt eine Kopie der Referenz auf das Objekt, so setzt auf sie endgültig das Objekt nicht endgültig machen, sondern nur die Referenz, die nicht sinnvoll

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top