Wie resistent sind finale Parameter?

Dr$arez

Grünschnabel
Ich habe mich mehrfach belesen, aber nirgends eine SICHERE Aussage gesehen. Wenn ich jetzt eine Methode habe, der ich ein Objekt als Argument übergebe und ich nicht will, dass das Objekt seinen Zustand ändern kann, so würde ich den Parameter final setzen:
Code:
public void myFunction(final MyObject myObject){...}
Jetzt stellt sich mir die Frage: wird das Argument myObject nun als clone übergeben? Die gefahr sehe ich, wenn das übergebene Objekt selber Methoden beinhaltet, die es verändert. Beispielsweise eine Methode
Code:
public void multiply(double zahl){ internesAttribut *= zahl; }
Nun hätte man ja doch die Möglichkeit über die Methode von myObject ein MyObject auch innerhalb des Methodenrumpfes zu verändern. Das final sagt ja dann nur aus, das ich den 'Zeiger' (tschuldigung) myObject innerhalb meines Methodenrufpes nicht neu referenzieren kann, Änderungen an den Objektattributen möglich sind?
Ist das so?
(Meine Lösung wäre in dem Falle in all jenen meinen Methodenblöcken eine Kopie des Arguments per MyObject copiedObject = myObject.clone() anzulegen...)
 
Hallo,

Das final sagt ja dann nur aus, das ich den 'Zeiger' (tschuldigung) myObject innerhalb meines Methodenrufpes nicht neu referenzieren kann, Änderungen an den Objektattributen möglich sind?

Genau. Mehr macht final nicht.

MFG

Sascha
 
Ja da hast du richtig gelesen. Final sagt nur dass keine erneute Zuweisung erfolgen darf, aber natürlich kann das Objekt intern mit den zur Verfügung stehenden Methoden verändert werden. Genau genommen weist final auch nur den Compiler an so etwas nicht zuzulassen. Zur Laufzeit ist dies wiederum je nach Java-Version möglich: http://www.javaspecialists.eu/archive/Issue096.html

Das was du haben möchtest ist immutable. Die Methoden von Collection.unmodifiableList etc lösen dass z.B. so dass das Original-Objekt gewrappt wird und die Methoden überschrieben werden so dass sie nichts tun, oder bei Aufruf eine Exception werfen. Das könntest du ja auch so machen wenn du eine Veränderung verbieten möchtest.
 
Wunderbar - Danke euch!

Nun mein Objekt möchte ich schon verändern, jedoch nur meine Methoden-Lokale Kopie, also führt wohl kein Weg um ein sauberes clone herum.

danke.
 
Zurück