# Return by value mit String??



## Fredy (29. Aug 2003)

Hallo Java Guru,
ich hab ein kleine Problem, und zwar habe ich eine Methode, der ich einen (leeren) String übergebe. In der Methode selbst erzeuge ich einen StringBuffer, fülle diesen ab und möchte ihn dann dem String zuweisen. Das Problem ist nun, dass die Zuweisung zwar funktioniert, aber sobald der Programmablauf ausserhalb dieser Methode ist, der String wieder den alten Wert annimmt. Wer kann mir da weiterhelfen?
Hier noch der Code:

```
public void getProperty (String property)
{
	StringBuffer strBuf = new StringBuffer();
	// fuelle den StringBuffer mit Daten ab
	fillUp(strBuf);
	
	// kopiere den StringBuffer in den String
	property = strBuf.toString();
}
```

Es ist mir zwar klar, dass property als Referenz übergeben wird. Mir ist aber nicht klar, weshalb das Objekt strBuf wieder gelöscht wird, obwohl es noch referenziert wird.
Gelöst hab ich das Problem nun, indem ich direkt den StringBuffer übergebe und ihn nicht erst in der Methode erzeuge. Aber das müsste doch auch anders gehn, oder?
Hat jemand eine Idee?

Gruss Fredy


----------



## mariopetr (29. Aug 2003)

tja, das het mit java nicht.
am einfachsten wird es sein, den string als returnwert rauszureichen


----------



## aquanox (29. Aug 2003)

Hi,

die Erklärung sollte nicht allzu schwer sein.

Ähnlich wie bei primitiven Datentypen (char, int, ...) wird der String nicht als Objekt übergeben.


```
public void getProperty (String property)
{

  // Du ruft die Methode nun auf mit getProperty(stringvar)
  // Allerdings wird bei einem String nicht die Referenz darauf zurückgegeben sondern
  // der Compilter könnte daraus sowas machen: getProperty(stringvar.toString()).
  // Das bedeutet, dass nun nur der Inhalt übergeben und dann hier in der Variable
  // property gespeichert wird. Problem liegt auf der Hand: property ist nur für die
  // eine Methode gültig, genauso wie strBuf, denn das Objekt wird ja lokal erstellt.
  // Lösung könnte sein, gleich ein StringBuffer Objekt zu übergeben oder mit einem
  // Rückgabeparameter zu arbeiten.

   StringBuffer strBuf = new StringBuffer();
   fillUp(strBuf);
   
   property = strBuf.toString();
}
```


----------



## mariopetr (29. Aug 2003)

na aber hallo,

der string wird sehr wohl als object uebergeben. das hat aber mit dem problem auch garnichts zu tun. da java prinzipiell call by value nutzt.

siehe dazu

```
public class Val
{
	public static void main(String[] args)
	{
		Val v=new Val();
		Object test=new Object();
		System.out.println(test);
		v.test(test);
		System.out.println(test);
		
	}
	
	void test(Object aObject)
	{
		aObject=new Object();
		System.out.println("new ="+aObject);
	}
}
```

*Edit:*
Bitte Code-Tags benutzen!


----------



## aquanox (29. Aug 2003)

Moin,

klar wird der String als Objekt übergeben, allerdins wird die Referenz dann nicht gespeichert sondern der Text. Nichts anderes wollte ich oben verdeutlichen.


----------



## Fredy (29. Aug 2003)

Herzlichen Dank für die Antwort!!

Ich habs jetzt gelöst, indem ich in der Methode einen StringBuffer erzeuge und ihn per 'return' zurück gebe. 

Gruss und Dank    Fredy 

 :wink:  :wink:


----------



## DTR (30. Aug 2003)

Es wird schon die Referenz gespeichert. Bei Strings ist es nur das problem, das diese nicht geändert werden können. D.h. 

  String a = "Hallo";
  a = a + "wie gehts?";

der neue String wird nicht im selben Objekt gespeichert, sonder es wird ein neues Objekt mit dem Wert "Hallo wie gehts" angelegt und der Zeiger a zeigt auf dieses neue Objekt. Das ist auch der grun für das Problem, das die Anwendungen so verdammt langsam werden, wenn man Strings direkt zusammen setzt anstatt einen StringBuffer zu verwenden.

Die beste Lösung für dein Problem ist es wohl den String als Rückgabewert zu übergeben oder statt einem String einen StringBuffer zu verwenden, dann geht es.


----------

