Call by Value

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
 
S

SlaterB

Gast
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
 

Tellerrand

Bekanntes Mitglied
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.
 

Ullenboom

Bekanntes Mitglied
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
 
B

bygones

Gast
oeh bin ich blind oder da es Instanzvariablen sind geht das so schon immer...
 
S

Slompf

Gast
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
 

Tellerrand

Bekanntes Mitglied
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 -.-
 
S

Slompf

Gast
Nun gut, dann muss ich mich wohl in mein Schicksal ergeben. Zumindest bis ich Java 6 nutze.

Danke euch, Torsten
 

Tellerrand

Bekanntes Mitglied
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Java - Call by value <-> Call by reference Allgemeine Java-Themen 16
MQue call by value Allgemeine Java-Themen 5
P call by value/referenz Allgemeine Java-Themen 4
N Sieht aus wie ein "Call by Referece/Call by Value" Allgemeine Java-Themen 7
H Aus der FAQ: Call by Value <-> Call by Reference Allgemeine Java-Themen 8
A Java Call-Hierarchie Allgemeine Java-Themen 2
V JNI Call Crash verhindern (abfangen) Allgemeine Java-Themen 2
E wie call by reference mit Wrapper-Klassen? Allgemeine Java-Themen 2
K Als Rückgabewert ode call by referenz was ist sauberer? Allgemeine Java-Themen 12
J InvocationException im Thread (innerhalb von call() einer Callable Klasse) Allgemeine Java-Themen 2
hdi ClassLoader / Constructor Call intern Allgemeine Java-Themen 11
S Performance und Function Call Depth Allgemeine Java-Themen 6
S Active-X Call / Invoke?` Allgemeine Java-Themen 7
sliwalker Call by Reference - Was stimmt denn nun ? Allgemeine Java-Themen 14
W Socket.setSoTimeout -> BufferedReader -> Default value Allgemeine Java-Themen 4
M Thymeleaf th value und th text Allgemeine Java-Themen 1
N Value Wert aus HTML-Button mittels thymeleaf spring an java übergeben Allgemeine Java-Themen 2
Meeresgott Effizientester Weg um nach der Value einer verschachtelten Map aufzulösen Allgemeine Java-Themen 5
Thallius Key/Value Table in Klasse einlesen Allgemeine Java-Themen 14
S @Value mit bestimmt Werten, sonst default Allgemeine Java-Themen 42
H Klassen LibGDX - Verschiedene Klassen als Value in einer Map Allgemeine Java-Themen 8
B HashMap aus Value Key bekommen Allgemeine Java-Themen 2
F Unterschied zwischen NormalizedValue und Value Allgemeine Java-Themen 5
Q For-Schleife in String-Value Allgemeine Java-Themen 3
L Variablen HashMap nimmt value nicht an Allgemeine Java-Themen 3
B Load of Known null Value Allgemeine Java-Themen 9
T Hashmap mit geordneter/ungeordneter liste als Value Allgemeine Java-Themen 5
algorismi int-variable Value Change event Allgemeine Java-Themen 3
G HTTP key-value-paar Allgemeine Java-Themen 8
J Map nach value sortieren Allgemeine Java-Themen 14
G Verschachtelte Treemaps, nach Value sortieren Allgemeine Java-Themen 11
faetzminator Regex zur Suche von "value-losen" Attributen in HTML Tags Allgemeine Java-Themen 7
T Set.contains() auch false wenn value == null? Allgemeine Java-Themen 4
G Generics in Map. Type of value abhängig vom key Allgemeine Java-Themen 3
S Map die die auch ein getKey(value) erlaubt? Allgemeine Java-Themen 2
F Javadoc: @value tag nicht für private fields? Allgemeine Java-Themen 11
T [TreeMap] Corresponding value to a key Allgemeine Java-Themen 10
V Objekt aus Session als copy by value bekommen Allgemeine Java-Themen 4
R Wert in Hashtable ändern (Key ändern, Value bleibt) Allgemeine Java-Themen 3
C Map(Key/Value) mit mehreren Values Allgemeine Java-Themen 16
M Value als String in beliebige Klasse konvertieren Allgemeine Java-Themen 18
Fredy Return by value mit String?? Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben