Frage

  

Mögliche Duplizieren:
   Ist Java „pass-by-reference“?

Ich fand eine ungewöhnliche Java-Methode heute:

private void addShortenedName(ArrayList<String> voiceSetList, String vsName)
{
     if (null == vsName)
       vsName = "";
     else
       vsName = vsName.trim();
     String shortenedVoiceSetName = vsName.substring(0, Math.min(8, vsName.length()));
     //SCR10638 - Prevent export of empty rows.
     if (shortenedVoiceSetName.length() > 0)
     {
       if (!voiceSetList.contains("#" + shortenedVoiceSetName))
         voiceSetList.add("#" + shortenedVoiceSetName);
     }
}

Nach allem, was ich über Java Verhalten gelesen habe für Variablen, komplexe Objekte oder nicht vorbei, soll dieser Code genau das tun, nichts. Also äh ... bin ich etwas fehlt hier? Gibt es eine Feinheit, die auf sie verloren war, oder hat dieser Code gehört auf thedailywtf?

War es hilfreich?

Lösung

Wie Rytmis sagte, geht Java Referenzen von Wert. Was dies bedeutet, ist, dass man berechtigterweise Methoden auf die Parameter einer Methode mutiert aufrufen können, aber man kann sie nicht neu zuweisen und erwarten, dass der Wert zu propagieren.

Beispiel:

private void goodChangeDog(Dog dog) {
    dog.setColor(Color.BLACK); // works as expected!
}
private void badChangeDog(Dog dog) {
    dog = new StBernard(); // compiles, but has no effect outside the method
}

Edit: Was dies bedeutet in diesem Fall ist, dass, obwohl voiceSetList Macht Änderung als Ergebnis dieses Verfahrens (es ein neues Element hinzugefügt, um es haben könnte), das Änderungen an vsName außerhalb des Verfahrens nicht sichtbar sein. Um Verwirrung zu vermeiden, ich markiere oft meine Methode Parameter final, die sie davon abhält, neu zugewiesen werden (zufällig oder nicht) innerhalb der Methode. Dies würde das zweite Beispiel verhindern, überhaupt zu kompilieren.

Andere Tipps

Java passiert Referenzen nach Wert , so dass Sie eine Kopie der Referenz, aber das referenzierte Objekt ist das gleiche. Daher ist diese Methode, um die Eingabeliste nicht verändert.

Die Referenzen selbst werden von Wert übergeben.

Von Java, wie man programmiert, 4. Auflage von Deitel & Deitel: (. Pg 329)

  

Im Gegensatz zu anderen Sprachen, Java erlaubt es nicht, der Programmierer zu entscheiden, ob passieren   Jedes Argument durch den Wert oder Bezug genommen wird. Primitive Datentyp Variablen werden immer bestanden   von Wert. Objekte sind nicht auf Methoden übergeben; vielmehr sind Verweise auf Objekte übergeben   Methoden. Die Referenzen sich durch Mehrwert-Kopie einer Referenz übergeben werden, werden übergeben   ein Verfahren. Wenn eine Methode eine Referenz auf ein Objekt empfängt, kann das Verfahren manipulieren   das Objekt direkt.

Dieses Buch wird verwendet, wenn Java in der Schule zu lernen. Brilliant Referenz.

Hier ist ein guter Artikel erklärt es. http://www.javaworld.com/javaworld /javaqa/2000-05/03-qa-0526-pass.html

Nun, es kann die ArrayList manipulieren - die ein Objekt ist ..., wenn Sie einen Objektverweis herum vorbei (auch von Wert übergeben), Änderungen an diesem Objekt wird an den Anrufer widerspiegeln. Ist das die Frage?

Ich glaube, Sie sind verwirrt, weil vsName geändert wird. Aber in diesem Zusammenhang ist es nur eine lokale Variable, auf dem exakt gleichen Niveau wie shortenedVoiceSetName.

Es ist mir nicht klar, was die genaue Frage innerhalb des Codes ist. Java ist Pass-by-Wert, sondern Arrays sind pass-by-reference, da sie keinen Gegenstand, sondern nur Zeiger passieren! Arrays bestehen aus Zeigern, nicht reale Objekte. Das macht sie sehr schnell, sondern auch macht sie gefährlich zu handhaben. Um dies zu lösen, müssen Sie sie klonen eine Kopie zu bekommen, und selbst dann wird es nur die erste Dimension des Arrays klonen.

Für weitere Informationen meine Antwort siehe hier: In Java, was ist eine flache Kopie?

(auch meine andere Antworten sehen)

Übrigens, gibt es einige Vorteile, wie Arrays sind nur Zeiger: Sie können (ab) sie als synchronisierte Objekte

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