でコンストラクタの後に、私はいつも問題は次の通りであるオブジェクト自体は常にJavaの
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);
}
}
}
に依存したコードの特定のビットを実行するために必要な状況を持っている方法を実行します。この例では、コンストラクタでthis
を使用します。別のスレッドがsomeX.getAListを介してオブジェクトにアクセスしようとすると、そのスレッドはコンストラクタが終了する前にそのオブジェクトにアクセスできる可能性があります。オブジェクトがsomefuncによって連想リストに追加されますように
あなたはそれを作ることができ
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;
}
}
問題はBさんとCさんも他の場所でインスタンス化することができ、そのたびBまたはCが作成されますが、彼らが必要となるということですその特定の方法で追加することができます。 AListにオブジェクトを追加するのは、ユーザーの責任ではなく、クラスの責任であることを望みます。私はまた、ユーザーがこれを行うinit関数を呼び出す必要はありません。一方、私は並行性の問題を望んでいません。
これを実装する方法やパターンはありますか?
Golangには、関数/メソッド/コンストラクタの実行後にコードを実行できるようなものがあります。
感謝を。あなたの最終版は少し上ですが、自分のコードをどのように構造化したいのか分かりました。私のコードを自分の投稿した答えで見ることができます。 –
'final'の' create'メソッドの中でオブジェクト参照を作成する点は何ですか? –
これは、リストに入れられたインスタンスと返されるインスタンスが同じであることを確認します。いつでも再割り当てすることはできません。 – HopefullyHelpful