2016-03-23 14 views
0

私は以前の質問をあまりにも複雑なので削除しました。私は多目的なデータ駆動型のシステム動作を作成しています。私が必要なときにはいつでもリアルタイムでオブジェクトを作成することができないので、プログラムの始めにすべてを解析して保存します。これらの動作は、実際にその所有者のためのアクションを実行します。コピーするかコピーしないかを指定してください

私は行動をコピーし、それらに所有者を追加することができます。しかし、私はこれが不要であり、その振る舞いがテンプレートとして機能できると思います。したがって、同じ動作をする各所有者は同じオブジェクトを参照しています。

動作は、所有者がイベントを経験するとアクティブになります。そのため、動作にはOwnerListenerがあり、動作がイベントと互換性がある場合は、動作を実行します。

public class Behavior implements OwnerListener { 
    List<Action> actions = new ArrayList<>(); 

    HashMap<String, Object> additionalData = new HashMap<>(); 

    public Behavior(XmlElement behaviorNode) 
    { 
     //Parse XML 
    } 

    @Override 
    public void seeSomeone(Object someone) { 
     //Since I need to run the actual greet action that was created by XML I need to store the person to greet.  
     additionalData.put("PERSON_SEEN", someone); 

     for (Action action : actions) 
     { 
      //if action is compatible with seeing someone action.perform(); 

      //if that action actually needs the person it can take it from this behavior template additionalData.get("PERSON_SEEN"); 
     } 
    } 

    @Override 
    public void getTalkedTo(Object talker) { 
     additionalData.put("BEING_TALKED_TO", talker); 

     for (Action action : actions) 
     { 
      //if action is compatible with being talked to action.perform(); 
     } 
    } 
} 

は今、私はこれらの行動の多くを持っているので、そのうちのいくつかは、巨大な(行動の多くの数十)することができます。私は本当に各所有者のためのコピーを持つように感じていない。

ボトルネックは、アクションが実行時に特定のデータにアクセスする必要があるため、追加のデータフィールドです。また、所有者にアクセスする必要もありますが、各リスナーメソッドのデータフィールドによって提供することもできます。

この質問はまだ長く続きました。私はそれが今より明らかであることを願っています。私は本当に各所有者のためにそれぞれの行動をコピーする必要がありますか、それとも他の方法がありますか?私のXMLデータはかなり大きいですが、1つのビヘイビアで多くのデータとたくさんのアクションが発生する可能性があります。 「無限」の行動量があり、各所有者はそれぞれの行動を所有する可能性があります。

答えて

0

何十億ものオブジェクトインスタンスを維持する必要がありますか?

すでに所有者関連のデータを格納する必要があると述べたので、 インスタンスが少なくなることは期待できません。一方、実際のコードはすでにクラスインスタンスによって共有されており、各インスタンスに対して「コピー」されません。したがって、オブジェクトインスタンスはデータ空間のみを使用します。

個々のインスタンスを設定するために使用しているXML構成がすべての所有者の間で「一定」である場合。分割された実装を使用できます。所有者が「既知」で、関連するXMLで初期化されたオブジェクトをインスタンス化しますが、そのXMLを、ローカルインスタンスとして使用され、すべてのインスタンスで共有されるクラスのXMLコード固有インスタンスを保持するファクトリクラスに転送します処理のために渡されたデータを取得する「同じ」動作のもちろん、これらの動作インスタンスは、適切な共有を可能にするために不変オブジェクトとして暗示される必要があります。

0

不変のStrategyオブジェクトを使用すると、それらを共有できます。

関連する問題