Java mit Call by Reference?
-
Hallo wollt mal fragen wie das mit der Call by Reference aussieht? Will einfach einen Integer übergeben und acuh dass er verändert wird...
Habe es jetzt so klapt aber nicht:public void test (Integer ddd) { ddd = Integer.valueOf(3); }
Merci
-
Es klappt deshalb nicht, weil Java nur Übergabe als Wert kennt. ddd ist eine Referenz auf ein Integer-Objekt und zeigt innerhalb der Methode test nach der Zuweisung dann auf ein anderes Objekt. Die Original-Referenz jedoch zeigt weiterhin auf das alte Integer-Objekt, weil die Referenz by value übergeben wurde.
-
Ja und wie kann ich jetzt einen Integer jetzt umsetzen.
Integer var = 3;
geht ja nicht..
-
Der Java-Weg ist, den neuen Wert zurückzugeben. Wenn du mehrere Werte zurückgeben willst, lassen sie sich oft sinnvoll zu Klassen zusammenfassen und dann machst du return new Bla(...);
Du kannst auch ne zusätzliche Indirektion einbauen, indem du eine Klasse IntegerReference schreibst, die ne veränderbare Referenz auf ein Integer-Objekt hat. Nicht zuletzt kannst du dir auch eine eigene Integer-Klasse schreiben, die nicht immutable ist. Wahrscheinlich ist das mit dem Integer eh nur als Beispiel gedacht, oder?
-
Ja war schon nur als Beispiel gedacht bin gerade am Java einarbeiten... Naja manche Dinge find ich da schon etwas merkwürdig .
-
-
Frage:
Wie implementiere ich in Java folgende Funktionen:
void swap (int& a, int& b); // bitte ohne XOR Tricks lösen ;) void swap (object a, object b);
Danke für Antwort :p
-
Gar nicht. So ein swap kannst du in Java nicht implementieren. (Sieh es positiv, es sind keine komischen Seiteneffekte wie bei C++ möglich )
-
Wie sieht das eigentlich mit Collections aus ? Wenn ich einfach eine Collection als Parameter übergebe, und die dann innerhalb meiner Methode veränder, dann werden die Änderungen nicht nach außen hin wirksam... Ich dachte in Java werden standardmäßig alle Objekte per Referenz übergeben ?
-
Nope, es wird eine Kopie der Referenz auf dein Objekt X übergeben. Siehe auch:
gugst du hier schrieb:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-126814.html
(Aus Link) schrieb:
When you pass an object reference into a method, you are passing a COPY of the REFERENCE.
-
Wow Java ist ja grottig.
-
ich lach mich tot schrieb:
Wow Java ist ja grottig.
Ich bin mir sicher, dass diese Features nicht umsonst aus Java gebannt wurden.
So enstehen wenigstens keine komischen Seiteneffekte.
-
Ich bin mir sicher, dass dieses Features aus Java gebannt wurde, weil
man es so einfach wie möglich halten wollte und mittlerweile bitter bereut.Jockel
-
ich habe diese features eigentlich nur kurz vermisst. wenn man schon so speicher und laufzeitkritische sachen machen muss, dann sollte man halt einfach c nehmen...
-
Korbinian schrieb:
ich habe diese features eigentlich nur kurz vermisst. wenn man schon so speicher und laufzeitkritische sachen machen muss, dann sollte man halt einfach c nehmen...
Ein void swap (..) per JNI implementieren Nicht ernsthaft, oder ?
-
ich meinte ganz die sprache wechseln. übrigens ist mir grad ne idee gekommen, wies auch in java geht, erfordet nur einen copy constructor und die implementierte clone methode. wie es mit objects geht weis ich nicht genau, da kann man aber siucher irgenwas über diese reflection machen (also den klassennamen aus dem objekt holen)
void swap(ClassName a, ClassName b) { ClassName tmp = (ClassName)b.clone(); b.ClassName(a); a.ClassName(tmp); }
-
Das vertauscht nicht die Referenzen, sondern die Objekte. Ein swap ala c++ ist in Java schlicht und ergreifend nicht moeglich.
-
Genauso wenig, wie in C++ Reflection im Sinne von Java möglich ist.
Und gut ist.Jede Sprache hat ihre Vor- und Nachteile und Einstzwecke.
Das sich Leute daran immer noch die Eier schaukeln wollen, um zu sehen wer die dickeren hat ist inzwischen echt lachhaft!
-
Ein Swap ist in Java über eine zusätzliche Indirektion möglich, die in C++ implizit ist. Ein Foo& muss dabei als ein Objekt von Reference<Foo> dargestellt werden. So kann bei einer Reference<Integer> die enthaltene Referenz auf ein Integer verändert werden. Dies würde einem swap(Integer*, Integer*), also Zeiger-Swap entsprechen. Für primitive Typen muss man von Hand die passenden Reference-Klassen erzeugen, da die Generics nicht mit primitiven Typ-Argumenten arbeiten. Um zwei ints zu swapen, muss man dann zwei ReferenceInt-Objekte übergeben.
Ich empfehle natürlich nicht, so zu arbeiten und heiße es auch nicht gut. Es zeigt nur, dass ein swap sehr wohl möglich ist, hier fehlt es Java einfach an Ausdrucksfähigkeit. In C++ wird nicht viel anderes gemacht, aber man gibt halt als Parameter ein int an und der Compiler macht von selber int& draus, weil T& der Parametertyp ist - praktisch, nicht int&(myInt) schreiben zu müssen.
ref und out find ich in C# sehr schön gelöst, weil das auch einige Ausdrucksstärke verleiht, die C++ fehlt. Dort empfiehlt man gern, Zeiger als "Warnsymbol" zu verwenden, wenn der Parameter verändert wird. Das ist bei C++ einfach genauso etwas, was sich nicht schön ausdrücken lässt. "out" hingegen sagt klar, der Parameter wird zugewiesen - und muss es dann auch werden.
-
Optimizer schrieb:
Ein Foo& muss dabei als ein Objekt von Reference<Foo> dargestellt werden. So kann bei einer Reference<Integer> die enthaltene Referenz auf ein Integer verändert werden.
Wenn Reference (meinst du java.lang.ref.Reference?) nicht irgendwelche magischen Eigenschaften hat, dann kannst du trotz allem nicht das Original veraendern, nur das in der Referenz enthaltene Objekt.
Ich empfehle natürlich nicht, so zu arbeiten und heiße es auch nicht gut. Es zeigt nur, dass ein swap sehr wohl möglich ist, hier fehlt es Java einfach an Ausdrucksfähigkeit.
Du meinst, als intellektuelle Uebung koennte man theoretisch so was bauen. Man muesste ja alles vorsorglich in Referenzen wrappen, falls man mal swappen will ...
-
Bashar schrieb:
Optimizer schrieb:
Ein Foo& muss dabei als ein Objekt von Reference<Foo> dargestellt werden. So kann bei einer Reference<Integer> die enthaltene Referenz auf ein Integer verändert werden.
Wenn Reference (meinst du java.lang.ref.Reference?) nicht irgendwelche magischen Eigenschaften hat, dann kannst du trotz allem nicht das Original veraendern, nur das in der Referenz enthaltene Objekt.
Nein, ich meine nicht java.lang.ref.Reference. Warum kann ich das Original nicht verändern? Vielleicht willst du auf die folgende Situation heraus:
String a, b = "1"; String c = "2"; < magisches swap von a und c >
Ok, jetzt zeigt b noch auf "1", weil das eigentliche Objekt nicht verändert wurde. Dieses Verhalten ist aber wünschenswert. In Java spricht man halt Objekte nur über Referenzen an und zumindest das sehe ich nicht als Nachteil an. Man baut damit technisch völlig anders trotzdem nur das übliche Verhalten nach. Genau auf dieses Verhalten stützt sich auch das Design der unveränderlichen Strings. In C++ würde die Zuweisung in swap die Werte vertauschen, aber b müsste trotzdem noch den Wert "1" haben. Das erwarte ich auch bei jedem anderen Typ.
IMHO verlassen wir hier die Gefilde von "swap ist nicht möglich" und stoßen auf einen grundlegenden Designunterschied.