Parameterübergabe via Referenz
-
Hallo allerseits,
ich bin C/C++ Programmierer und dabei Java zu erlernen... schon stoße ich auf das erste Problem bei der Parameterübergabe...
Ich möchte ein Parameter b (Boole'scher Wert) übergeben und den Wert von b in einer Methode ändern. Verwende ich boolean als Parametertyp, so (das verwundert mich nicht, da die Übergabe Call-by-Value stattfindet) wird der Wert nur lokal in der Routine verändert. Verwende ich Boolean (das verwundert mich jetzt wird der Wert ebenfalls nicht geändert.
public void test(Boolean b) { b = Boolean.TRUE; }
Stimmt es, dass ich den Wert einer Instanz vom Typ Boolean _nicht_ ändern kann? Auf das Beispiel oben bezogen: nun wird nicht der Wert von b in eine lokale Variable für die Funktion kopiert sondern die Referenz auf die Instanz. Mit der Zeile b=Boolean.TRUE weise ich dem Objekt via Verweis keinen neuen Wert zu, sondern lasse die Referenz auf ein anderes Objekt zeigen. Stimmt das? Wie kann ich den Wert von b innerhalb der Routine modifizieren?
Schöne Grüße
Martin
-
lucky_tux schrieb:
Stimmt das? Wie kann ich den Wert von b innerhalb der Routine modifizieren?
Hi. Methoden mit Nebeneffekten stellen normalerweise schlechten Stil dar. Versuch's mal ohne.
-
@ Gregor:
Aber so etwas muss doch dennoch gehen... Wie mache ich das?
Grüße
Martin
-
Boolean ist immutable. Da kannst Du den Zustand der Instanz nicht ändern. Das geht auch nicht bei String, Integer, usw.. Insofern hast Du da keine Chance.
Du kannst aber natürlich mit aller Kraft versuchen, nicht "Java-like" zu programmieren. Übergib einfach ein boolean[] mit einem Element drin. Das kannst Du verändern.
-
lucky_tux schrieb:
Aber so etwas muss doch dennoch gehen... Wie mache ich das?
Es geht prinzipiell natürlich bei allen mutable Objekten. Die Wrapper der primitiven Typen (Integer, Boolean, ...) sowie String sind wie gesagt jedoch immutable.
In diesem Fall müsstest Du Dir einen eigenen Wrapper für einen boolean schreiben, dessen Wert man ändern kann. Du musst aber immer bedenken, dass in Java beim Methodenaufruf die Referenz des Parameters kopiert wird. Also: Wert des übergebenen Objekts ändern = Seiteneffekt. Aber: Referenz auf neues Objekt zeigen lassen = kein Seiteneffekt.