10

私は、これをコンストラクター引数に使用することは通常良い習慣ではないことを読んだときに(私はまだJavaの経験があまりありません)、私が行ったさまざまなソリューションについてしばらく考えました。

私がやろうとしているのは、クラス JobGroupMod のいくつかのオブジェクトをインスタンス化することです。すべての JobGroupMod に対して、特定の数の JobMod オブジェクトを作成する必要があります。このオブジェクトは、それらが生成された JobGroupMod オブジェクトを参照できる必要があります。

それを実現するためにJobModのコンストラクタに「this」を渡しているのですが、動いてもちゃんと設計している気がしませんでした。

public class JobGroupMod implements JobGroup {

    public JobGroupMod(Node n,Set<Job> clusterJobs){
        JobMod j=new JobMod(n,this);
    }
}

そして今、JobMod クラス:

public class JobMod implements Job {
     public JobMod(Node n, JobGroup jg){
         setJobGroup(jg);
     }
}

私の質問は、これを解決するより良い方法はありますか、それとも私の解決策は提案された方法ですか?

4

3 に答える 3

7

静的ファクトリ メソッド (有効な Java リンク) を使用してみてください。

thisこのようにして、控えめに言っても非常に賢明ではないコンストラクター呼び出しを渡すことを回避します。
コード例:

public class JobGroupMod implements JobGroup {

    public static JobGroupMod createModeMod(Node n, Set<Job> clusterJobs) {
        JobGroup jg = new JobGroupMod();
        JobMod j = new JobMod(n, jg);
        return jg;
    }
}
于 2012-12-24T17:11:54.917 に答える
5

JobGroupModコンストラクターで行う唯一のことは、影響を理解している限り、かなり安全です。現実世界には、これを行う Java コードがたくさんあります。特にマルチスレッドと並行性について話し始めると、それはまだ本当にやりたいことではありません。

オブジェクトが完全に構築される前に、危険がthis別のものに移ることです。これを行った後にコンストラクターが例外をスローし、完全に構築しなかった場合、厄介な問題が発生する可能性があります。渡したオブジェクトが完全に構築される前に、別のスレッドがそのオブジェクトにアクセスするthisと、厄介な問題が発生します。

Java でよく見られるのは、これを回避するためにファクトリ パターン、「init」タイプのメソッド、または依存性注入を使用する人々です。

于 2012-12-24T17:09:05.040 に答える
0

通常、魔法はありません。コンストラクターを介してパラメーターを渡すか、setter/init メソッドなどを使用して後で初期化することができます。

クラスへのJobMod参照が必要JobGroupModで、それなしでは何もしない場合は、コンストラクターを使用して渡します。それがなくても耐えられる場合はinit()、この参照を初期化できるメソッドまたはセッターを作成します。

ところで、パラメーター化されたコンストラクターとデフォルトのコンストラクターの両方を作成する必要がある場合があります。最初は通常のプログラムで使用する場合、2 つ目は XML、JSON、または Bean のようなクラスにとってより簡単な他のシリアル化を使用している場合です。この場合、少なくとも、デフォルトのコンストラクターを直接使用してはならないことを説明する javadoc を作成してください。

于 2012-12-24T17:07:28.647 に答える