Call by Value

  • Themenstarter Themenstarter Slompf
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
S

Slompf

Gast
Hallo,

ich wollte nur mal Fragen, was die gebrächliche Strategie ist eine "Call by Reference" - Parameterübergabe zu ersetzen.?

Extra ein Rückgabeobjekt zu schreiben, nur weil ich 2 Werte gleichzeitig ändern will scheint mir etwas übertrieben. Globale Variablen zu benutzen kann doch auch nicht die Lösung sein.

Wie behandelt ihr so ein Problem(chen)?


Torsten
 
bei Call By Reference hättest du keine Probleme,

dich stört wohl eher, dass du eine primitive Variable/ ein unveränderliches Objekt hast,
die By Value übergeben werden und deshalb das Original unverändert bleibt?

die Strategie liegt auf der Hand: mach ein By Reference draus!,
speichere die Variable in einem eigenen Objekt oder z.B. in einem int-Array der Länge 1
 
Normalerweise stellen sich solche Problemchen nicht. Ich hab damit jedenfalls in den seltensten Fällen zu tun, da man OOP like die Daten in Klassen kapselt. Eine Methode die zwei primitive Datentypen ändern will scheint mir nciht ganz normal 😉

Mal zur Erklärung, Java behandelt Parameter alle gleich, sie werden kopiert.
Übergibt man einen primitiven Datentyp wird dieser kopiert.
Übergibt man eine Referenz wird diese Referenz kopiert. (Das Objekt dahinter ist das gleiche)
Lösung, einfach eine Referenz auf den primitiven Datentyp setzen, dass kann alles mögliche sein, ein Array, etc.

Ansonsten kannst du auch mal das drumherum hier reinstellen, dann kann man bessere Lösungen aufzeigen.
 
Es gibt seit Java 6 -- ich weiß, noch nicht weit verbreitet 🙂 -- die Klasse http://java.sun.com/javase/6/docs/api/javax/xml/ws/Holder.html, die man verwenden kann.

static void productAndSum( int a, int b, Holder sum, Holder product )
{
sum.value = a + b;
product.value = a * b;
}

Der Aufrufer muss die Behälter aufbauen und übergeben:

Holder sum = new Holder();
Holder product = new Holder();
productAndSum( 9, 3, sum, product );
System.out.printf( "sum=%s product=%s", sum.value, product.value ); // sum=12 product=27

Grüße

Christian
 
oeh bin ich blind oder da es Instanzvariablen sind geht das so schon immer...
 
Hi,

mal ein paar Worte zum Kontext:

Es geht um eine kleine Parser- Methode. Die Methode bekommt einen String geliefert und soll aus diesem die erste Zahl auslesen und gleichzeitig den String um die ausgelesenen Zeichen kürzen:

Ausgangszustand:
String: 43,56+6,27=

Ergebnis:
String: +6,27=
Double: 43.56

Natürlich muss man das nicht in einer Methode machen. Ich bild mir das jetzt aber ein. :wink:

@Tellerrand: Ich weiß nicht wie ich eine Referenz übergeben soll. Bei c ging das mit dem &- Operator. Aber bei Java???


Torsten
 
Stimmt, normalerweise macht man das nicht in einer Methode, sondern setzt den String als Attribut einer Klasse 😉

Slompf hat gesagt.:
@Tellerrand: Ich weiß nicht wie ich eine Referenz übergeben soll. Bei c ging das mit dem &- Operator. Aber bei Java???
Es gibt meines Wissens keinen Operator der Call by Value ersetzt.
Java übergibt alle Typen immer als Kopie, wenn man Referenzen übergibt wird eben die Referenzen kopiert.

Dein Problem besteht eigentlich ja auch nur, weil man einen String schlecht ändern kann. (Zitat: "Die Klasse String repräsentiert unveränderliche Zeichenketten. ") Innerhalb der Methode greifst du jetzt schon auf den selben String zurück, kannst ihn aber nciht verändern.

Die einzige Möglichkeit die ich kenne ist es eben die Referenz, welche man übergeben will, in irgendein Container Objekt zu packen, so dass die Referenz auf das Container Objekt kopiert wird, aber eben das Container Objekt, und die Referenz die in diesem steckt, das selbe bleibt.
Übergeben wir z.B. ein Array, so wird die Referenz auf das Array kopiert, das Array bleibt innerhalb der Methode immernoch das selbe und somit kannst du den Inhalt des Arrays ändern.


Kurz gesagt, in Java kann man Referenzen nicht direkt übergeben, weil Java Parameter immer kopiert.


EDIT: OMG, eigentlich habe ich nur das geschrieben, was SlaterB hier im ersten Posting schon stehen hatte -.-
 
Nun gut, dann muss ich mich wohl in mein Schicksal ergeben. Zumindest bis ich Java 6 nutze.

Danke euch, Torsten
 
Slompf hat gesagt.:
Nun gut, dann muss ich mich wohl in mein Schicksal ergeben. Zumindest bis ich Java 6 nutze.
In Java 6 kann man auch keine Referenzen direkt übergeben!
Hier wurde nur geschrieben, dass es in Java 6 schon eine vorgefertigte Klasse Holder gibt. Diese macht aber auch nichts anderes als die Referenz die man übergeben will in ein Objekt zu packen.

Du hast also entweder die Möglichkeit eine Klasse zu schreiben wie:
Code:
public class StringHolder {
	private String value;
	
	public StringHolder() {}

	public String getValue() {
		return value;
	}
	public void setValue(String value) {
		this.value = value;
	}
}

Oder zu warten bis Java 6 dir so eine Klasse bietet.

Oder aber du nutzt wie schon geschrieben einfach ein Array oder ähnliches.



EDIT: ja ein generischer Holder wäre toller ...
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben