2017-09-10 2 views
1

問題があります: いくつかのインターフェイスを実装する2つのクラスがあります。クラスAではクラスBのオブジェクトのリストがあります。クラスAのオブジェクトのリストをクラスBのコンストラクタによって埋め込む方法

作成されるすべてのオブジェクトをハードコードする代わりに、クラスBのコンストラクタを使用してこれらのリストを生成する方法はありますか? クラスAでは、特定のクラスBオブジェクトを指定されたパラメータで検索するメソッドがありますが、問題は新しいオブジェクトが作成されるたびにこのリストを「オートポピュレートする」方法を見つけることです。

私はaddNodeToList()フォームクラスAを呼び出そうとしていましたが、このクラスのインスタンスでは実行できませんでした。

このリストを自動生成する方法はありますか?ここ

はコードです:

CLASS

public class MyStructure implements IMyStructure { 

    private List<INode> nodes; 

    public MyStructure() { 

    } 

    @Override 
    public INode findByCode(String code) { 
    //impl 
    } 

    @Override 
    public INode findByRenderer(String renderer) { 
     //impl 
    } 

    @Override 
    public int count() {{ 
    //impl 
    } 

    public void addNodeToList(INode node){ 
     nodes.add(node); 
    } 
} 

クラスB

public class CompositeNode implements ICompositeNode { 
private String code; 
private String renderer; 

MyStructure myStructure; 

public static int counter; 

public CompositeNode(String code, String renderer){ 
    this.code= code; 
    this.renderer=renderer; 
    myStructure.addNodeToList(this); 
    counter++; 
} 

EDIT: 私は約クラスBの内部の静的リストを作成して考えていましたしかし、私はそれが良い習慣ではないと思う。 私はこれを効率的な方法で解決する方法が考えられていません。

は、完成: を私はこのようなクラスAの内部メソッドを作成しました:

public class MyStructure implements IMyStructure { 
public void addNodeToList(String code, String renderer) { 

     CompositeNode node = new CompositeNode(code, renderer); 

     nodes.add(node); 
    } 

それは私が望んでいたように動作します - 私は、クラスBの内部のリストを格納いけないし、それはリストを移入自己。私は単に、クラスAにゲッターを追加し、さらに、コンテキストおよび使用方法を知ることなく

+0

それはノーですあなたが探しているものはすべてクリアされます。まず、あなたの "クラスA"は 'List 'を持っていますが、 "クラスB"は 'ICodeName'ではなく' ICompositeNode'を実装しています。何もない(ICompositeNodeが 'INode'を拡張しているのかもしれない?)場合を除いて、' Class B 'オブジェクトを 'List 'に入れることはできません。次に、クラスBのコンストラクタには2つの文字列が必要です。クラスAがその文字列パラメータなしでクラスBオブジェクトを構築できるようにするには、引数を取らないクラスBのコンストラクタを用意する必要があります。 – ajb

+0

したがって、これら2つのクラスはどのようにして相互に接続されていますか? –

+0

あなたの編集に反応する:それが効率的なら、あまりにも多くを得る方法はないと私は思います。クラスBの10項目のリストが必要な場合は、クラスBコンストラクタを10回コールする必要があります。 Javaには、10個のオブジェクトのスペースを一度に割り当てて初期化するという魔法の方法はないと思います。あなたはおそらくC++でこれを考案することができます。それはあなたが達成しようとしていたものですか? – ajb

答えて

0

public class MyStructure implements IMyStructure { 
    //... 
    public List<INode> getNodes() { 
     return this.nodes; 
    } 
    //.. 
} 

し、クラスAのリストに要素を追加するために、クラスBで使用することができる。

public CompositeNode(String code, String renderer){ 
    //... 
    myStructure.getNodes.add(this); 
    //... 
} 

addNodeToListメソッドが必要と思わない、他の場所で使用されていない場合。

+1

私は同様のものを作成しました クラスAの中で、 Bオブジェクト。もちろん必要なパラメーターを使用します。あなたのアイデアは絡み合っています。 助けてくれ、Grzesiu;)ポーランドからの挨拶:) – czarnyMati

+0

ここにはかなり悪い習慣があります。答えはまだ正しく、ちょうど悪いデザインです。 'myStructure.getNodes.add(this)'は[LoD](https://en.wikipedia.org/wiki/Law_of_Demeter)に違反し、[コンストラクタを介してオブジェクトをリークします](https://stackoverflow.com/questions/3921616/コンプレッサー漏れ - これはコンストラクター警告です)。 [コンテンツの結合](https://en.wikipedia.org/wiki/Coupling_(computer_programming)#Types_of_coupling)は、通常、拡張とデバッグが難しいコードにつながります。 'addToNode'は実際にはLoDに違反しないようにします(言いたいことはありませんが、必要に応じてimplを変更する余地を与えます)。調べるだけのいくつかのこと –

0

あなたは、iノードオブジェクトのリストをインスタンス化し、この方法でCompositeNodeオブジェクトで満たされMYSTRUCTUREオブジェクトにCompositeNodeを作成できるようにMYSTRUCTUREのコンストラクタで最初のノードを追加することができます。

MYSTRUCTURE

public class MyStructure implements IMyStructure { 
    private List<INode> nodes; 

    public MyStructure() { 
     super(); 
    } 

    public MyStructure(INode node) { 
     nodes = new ArrayList<>(); 
     nodes.add(node); 
    } 
    //... 
} 

CompositeNode

public class CompositeNode implements ICompositeNode { 
    private String code; 
    private String renderer; 
    private MyStructure myStructure; 

    public static int counter; 

    public CompositeNode(String code, String renderer){ 
     this.code= code; 
     this.renderer=renderer; 
     myStructure = new MyStructure(this); 
     counter++; 
    } 
    //... 
} 
+0

私はそれが非常に悪い考えだと思います。 私はいつも、私はCompositeNodeのコストラクターコンパイラは 'new MyStructure()' - >を実行し、この 'new ArrayList'が作成されているので(MyStructureコンストラクタのコード) – czarnyMati

+0

CompositeNodeオブジェクトを作成すると、コスト作成者はMyStructureインスタンスを作成し、その内部に最初のノードで一覧表示します。他の要素をリストに追加する場合は、リスト要素を取得して追加することができます。 – user8589247

+0

申し訳ありませんが私は以前に返事をしませんでしたが、私は管理するためにいくつかの予期しない任務がありました。投稿につきましては です。私はあなたのロジックが間違っていると思います 'MyStructure'コンストラクタの中に' new ArrayList <>(); 'ステートメントがあるので、' CompositeNode'コンストラクタを実行するたびに 'MyStructure'オブジェクトを作成し、それぞれの' MyStructure'オブジェクトに 'new ArrayList'が含まれています。 これは、すべてのリストに1つのINode要素しか含まれていないことを意味します。これはそうではありませんでした。 – czarnyMati

関連する問題