复制或不复制

时间:2016-03-23 19:39:51

标签: java xml pass-by-reference deep-copy data-driven

我删除了之前的问题,因为它太复杂了。我正在创建一个多功能的数据驱动系统行为。由于我无法在需要时实时创建对象,因此我会在程序开始时解析并存储所有对象。这些行为实际上是为其所有者执行操作。

我可以复制行为并将所有者添加到他们身上。但我认为这是不必要的,行为可以作为模板。因此,具有相同行为的每个所有者都指的是同一个对象。

当所有者体验事件时,可以激活行为。这就是行为具有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数据非常大,单个行为可以包含大量数据和许多操作。会有无尽的&#34;行为量和每个所有者可能拥有每个行为。

2 个答案:

答案 0 :(得分:0)

使用不可变的策略对象,以便共享它们。

答案 1 :(得分:0)

您需要维护多少数十亿个对象实例?

正如您已经声明的那样,您需要存储所有者相关数据, 你可能不会期望得到更少的实例。

另一方面,实际代码已经由类实例保持共享,并且不会被复制&#34;对于每个实例。因此,对象实例仅使用其数据空间。

如果您用于设置各个实例的XML配置是&#34;常量&#34;在所有业主中。您可以使用拆分实现。实例化一个已知的对象#34;由所有者进行初始化并使用相关的XML进行初始化,然后将该XML转发到工厂类,该工厂类维护一个类的特定于XML代码的实例,然后将其用作本地实例并在所有&#34;相同&#34的实例之间共享;获取传入数据进行处理的行为。当然,这些行为实例需要作为不可变对象来实现,以便进行适当的共享。