Referenz nicht up-to-date ???
-
Ich habe eine mainclass:
class Mainclass{ protected Object obj = null; private Otherclass other = new Otherclass(this); public Mainclass(Object obj){ this.obj = obj; //Works this.obj == obj; other.workWithObj(); } }
und eine Klasse, die auf die "obj" Variable angewiesen ist:
class Otherclass{ privaet Object obj = null; public Otherclass(Mainclass main){ this.obj = main.obj; } public void workWithObj(){ ... //NullPointerException: obj == null; } }
ist meine obj Referenz nicht up-to-date? Wenn ja, warum nicht(?) es wird doch kein neues Object angelegt, oder woran liegts?!
MFG John
-
Versuche es mal so:
class Mainclass{ protected Object obj; private Otherclass other; public Mainclass(Object obj){ this.obj = obj; //Works this.obj == obj; other = new Otherclass(this); other.workWithObj(); } }
MfG
DarkMight1
-
Würde sicherlich auch gehen, das Problem ist, dass sich der Wert des Objekts zur Laufzeit ändert, es geht natürlich so:
class Otherclass{ private Mainclass main = null; public Otherclass(Mainclass main){ this.main = main; } public void workWithObj(){ main.obj.doSomething(); EDIT: hier nicht mehr //NullPointerException: obj == null; } }
Ist blos nervig, wenn es 10 - 20 Variablen sind. Ich würde halt gerne verstehen, warum es nicht wie zuerst geschriebn funktioniert ...
MFG John
-
Musst du workWithObj() unbedingt im Constructor aufrufen?
Ehrlich gesagt weiß ich nicht so recht, warum der andere Vorschlag überhaupt funktioniert. Ich halte so ein Objekt für null, so lange der Constructor noch nicht vollständig abgearbeitet wurde. Deshalb erscheint es mir irgendwie plausibel, dass es da eine NPE gibt.
Ich denke es würde keine Probleme geben, würdest du die Methode nach dem Constructor aufrufen.
Ich mache das jedenfalls bei einigen Klassen so.
Sie erwarten auch Referenzen auf bestimmte Objekte, jedoch übergebe ich bei der Instanzierung der Objekte aus bestimmten Gründen in einigen Fällen erstmal null und initialisiere die Objekte dann erst später per setter und da ist die Referenz dann auch "up-to-date".
-
Okay über OOP brauchen wir nicht sprechen da es wirklich bösartig ist, was du fabrizierst.
Am besten du schaust mal nach, wie Konstruktoren abgearbeitet werden.
1. Ctor Oberklasse
2. Membervariablen werden initialisiert
3. Rumpf des Ctorsclass Mainclass{ protected Object obj = null; // hier liegt das problem du weist im Otherclass Ctor obj zu, wo es zu diesen zeitpunkt von die mit null deklariert wurde private Otherclass other = new Otherclass(this); public Mainclass(Object obj){ //Zuweisung kommt in diesen fall zu spät, da other schon längst initialisiert wurde this.obj = obj; //Works this.obj == obj; other.workWithObj(); } }
PS: Membervariablen werden implizit mit einen entsprechenden Standardwert initialisiert. Explizite Zuweisungen von null Werten sind zieml. unschön.
-
Das ich viels im Ctor mache ist sicherlich nicht schön, ist ne schlechte Angewohnheit. Aber wirklich erklärt hat's mir immer noch keiner ...
Ich tippe jetzt mal, man wollte mir sagen, dass ich, wenn ich mit null initialisiere keinen Speicherbereich reserviere? An sich sollte die "erste" zuweisung doch latte sein, oder etwa nicht? Ich dachte:
MainObjekt.refInMain -> Objekt
SubObjekt.refInSub -> refInMain -> Objekt
falsch gedacht?
über
SubObjekt.refToMain -> MainObjekt.refInMain -> Objekt
geht's jaMFG John