Ich habe eine Situation, wo ich immer ein gewisses Stück Code ausführen müssen, die sich auf dem Objekt hängtImmer Verfahren nach Konstruktor in Java ausführen
public abstract class A{
public A(X x){
//init A stuff
x.getAList("stuff").add(this);
x.getAList("otherstuff").add(this);
}
}
public class B extends A{
public B(X x){
super(x);
//init B stuff
}
}
public class C extends A{
public C(X x){
super(x);
//init C stuff
x.getAList("otherstuff").remove(this);
x.getAList("morestuff").add(this);
}
}
public class SomeClass{
private X someX;
public A somefunc(boolean b){
if(b){
return new B(someX);
}else{
return new C(someX);
}
}
}
Das Problem ist die folgende. In diesem Beispiel verwende ich this
im Konstruktor. Wenn ein anderer Thread versucht, über someX.getAList auf das Objekt zuzugreifen, kann dies dazu führen, dass dieser Thread auf das Objekt zugreift, bevor der Konstruktor beendet wurde.
Man könnte es machen, so dass das Objekt den AList von someFunc hinzugefügt wird
public class SomeClass{
private X someX;
public A somefunc(boolean b){
A a;
if(b){
a = new B(someX);
someX.getAList("stuff").add(a);
someX.getAList("otherstuff").add(a);
}else{
a = new C(someX);
someX.getAList("stuff").add(a);
someX.getAList("morestuff").add(a);
}
return a;
}
}
Das Problem ist, dass B und C ist auch an anderer Stelle instanziert werden könnte und dass jedes Mal ein B oder C erstellt sie müßten auf die angegebene Weise hinzugefügt werden. Ich möchte nicht, dass das Objekt dem AList hinzugefügt wird, sondern die Verantwortung des Benutzers, aber der Klasse. Ich möchte auch nicht, dass der Benutzer eine Init-Funktion aufrufen muss, die dies für sie tut. Auf der anderen Seite möchte ich keine Nebenläufigkeitsprobleme.
Gibt es einen Weg oder ein Muster, das es ermöglicht, dies zu implementieren?
Golang hat so etwas wie defer, mit dem Sie einen Code ausführen können, nachdem die Funktion/Methode/Konstruktor ausgeführt wurde.
Vielen Dank für Ihre Eingabe. Obwohl Ihre endgültige Version ein wenig übertrieben ist, haben Sie mir eine Idee gegeben, wie ich meinen Code strukturieren möchte, den Sie in meiner eigenen eingereichten Antwort sehen können. –
Könntest du bitte klarstellen, was es bedeutet, einen Objektverweis innerhalb 'create' Methoden' final' zu machen? –
Dadurch wird sichergestellt, dass die in die Liste und die zurückgegebene Instanz identisch ist. Es kann zu keinem Zeitpunkt neu zugewiesen werden. – HopefullyHelpful