Referzenzen

dg87

Erfahrenes Mitglied
Hallo,

jetzt muss ich mal doof Fragen. Ich schaue mir gerade den Code an, den ich in ungefähr auch für meine Klasse brauchen kann.
Dann kommt diese Zeile:
Code:
 if (checkForExistingPlace(externalId)) {
              // if place already exists in db (identified by external provider and external id) move eventreader to end of this location
              advanceToLocationEnd(eventReader);
              continue;
            }

Die Funktion:
Code:
  /**
   * @param eventReader
   * @throws XMLStreamException
   */
  private void advanceToLocationEnd(XMLEventReader eventReader) throws XMLStreamException {
    while (eventReader.hasNext()) {
      XMLEvent event = eventReader.nextEvent();
      if (event.isEndElement()) {
        // end of place
        if (event.asEndElement().getName().toString().equals(LOCATION_TAG)) {
          return;
        }
      }
    }
  }

Mir gehts nicht darum was sie macht, das ist mir schon klar. Mich interessiert nur, warum mein ehemalige Kollege das so gemacht war. Das Prinzip ist ganz einfach. Der eventReader hat halt immer den Inhalt von einer XML, also jeden Tag drinnen.
Wenn es einen Wert in meiner DB schon gibt, dann soll der Eventreader wieder von vorne anfangen.
Hätte da nicht ein einfacher continue wie oben gereicht? Stattdessen übergibt er den Reader und lässt ihn in einer funktion durchlaufen bis er am Ende, also am letzten Tag der XML angekommen ist.
Ich dachte das kann so gar nicht gehen. Wenn ich einen Wert einer Funktion übergeben, is das doch lokal. Also durchgeht er ja nicht den Eventreader von oben, bzw der oben nicht in der Funktion bleibt ja ungerührt. Oder führt Java darauf eine Referenz, weil ich gib ja den Wert nicht mal zurück.
Also man kann sich das doch sparen das durchzählen, wenn das eh nur lokal in der Funktion passiert, oder denke ich falsch? Mir gehts ned um die Logik, sondern vielmehr darum, ob Java wenn man eine Variable einer Funktion übergibit wie hier, diese auch referenziert wird, sodass sie außerhalb der Funktion auch den geänderten Wert hat...
 
Oh man siehe da das wusst ich nicht. Heißt ich ändere in der Funktion ein Objekt dann wird es außerhalb auch geändert. Bei Int und so nicht...

Vielen Dank
 
Hallo,

"innerhalb" und "ausserhalb" passt hier nicht. In Java werden Objekte immer als Referenzen übergeben, d.h. du hast in der Funktion nur einen Verweis auf einen Speicherbereich wo das Objekt liegt. Greifst du nun über die Methoden der Objekt-Klasse auf eines ihrer Felder zu und veränderst du das, ist das natürlich überall sichtbar wo die gleiche Referenz auf das Objekt verwendet wird.

Kurz gesagt, das Objekt ist "innerhalb" und "ausserhalb" deiner Funktion das selbe.

Gruß,
Wolf
 
Ah prima, super. Klasse :)
Frage am Rande - sorry für den OT. Ist das dann NUR bei Java so, oder zB auch bei PHP oder anderen OOP sprachen (c, oder c++)

LG
 
Hallo,

bei PHP weiss ich es nicht. Bei C/C++ ist das nicht der Fall. Da musst du explizit mit Pointern (*) oder Referenzen (&) arbeiten, wenn du das gleiche Verhalten wie bei deiner Java-App erhalten willst. Würdest du keine Pointer/Referenzen als Parameter deiner Funktion/Methode verwenden, dann würde bei jedem Aufruf der Methode mit einem Objekt als Paramater, dass Objekt uns seine Felder kopiert werden und an die Methode übergeben werden. Das heisst Änderungen an dem Objekt würden nur innerhalb der Methode/Funktion Gültigkeit haben, ausserhalb der Funktion/Methode aber nicht sichtbar sein.

Gruß,
Wolf
 
Ergänzend noch zu C/C++:
Wie die Objekte "kopiert" werden kann/sollte man komplett selbst festlegen
(Copykonstruktor, operator=)

Je nach Anwendungsfall macht es auch schon mal Sinn,
dass ein kopiertes Objekt nicht 1:1 gleich ist, sondern irgendeinen Bezug zu seiner Quelle hat.

Unabhängig davon ist das automatisch generierte Kopieren vom Compiler
(wenn man nichts selbst dafür programmiert) nicht immer das, was man sich selbst vorstellt.
vA. wenn im Objekt Pointer etc. sind.
 
Frage am Rande - sorry für den OT. Ist das dann NUR bei Java so, oder zB auch bei PHP oder anderen OOP sprachen (c, oder c++)
Bei PHP werden alle Variablen außer Objekte oder explizit als Referenzen markierte Parameter Pass-By-Value übergeben.
 
Kleine Anmerkung von mir... Bei Objekten wird zwar schon die Referenz mitgegeben, aber wenn man die referenz neu instanziiert, wird ein neues Objekt angelegt und das alte wird beibehalten...

Code:
public class Test {
	private String value;

	public Test(String value) {
		this.value = value;
	}

	public String getValue() {
		return value;
	}

	public static void manipulate(Test test) {
		test = new Test("manipulation");
	}

	public static void main(String[] args) {
		Test t1 = new Test("instance one");
		Test t2 = new Test("instance two");
		
		System.out.println(t1.getValue());
		System.out.println(t2.getValue());
		Test.manipulate(t1);
		System.out.println(t1.getValue());
		System.out.println(t2.getValue());
	}
}

Output:
Code:
instance one
instance two
instance one
instance two

Gruss,
slowy
 
Zurück