【问题标题】:To copy or not to copy复制还是不复制
【发布时间】:2016-03-23 19:39:50
【问题描述】:

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

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

当所有者遇到事件时,可以激活行为。这就是行为具有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 数据非常大,一个行为可以包含大量数据和数十个操作。会有“无穷无尽”的行为,每个所有者都可能拥有每一个。

【问题讨论】:

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


    【解决方案1】:

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

    正如您已经说过的,您需要存储与所有者相关的数据, 您可能不会期望获得更少的实例。

    n 另一方面,实际代码已经由类实例共享,并且不会为每个实例“复制”。所以,对象实例只使用它们的数据空间。

    如果您用于设置单个实例的 XML 配置在所有所有者中都是“恒定的”。您可能会使用拆分实现。实例化所有者“已知”并使用相关 XML 初始化的对象,然后将该 XML 转发到工厂类,该工厂类维护类的 XML 代码特定实例,然后用作本地实例并在所有实例之间共享获取传入数据进行处理的“相同”行为。当然,这些行为实例需要实现为不可变对象以允许正确共享。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2013-06-03
        • 1970-01-01
        • 2019-01-21
        • 1970-01-01
        • 2011-02-20
        • 2011-05-01
        • 1970-01-01
        • 2012-01-22
        • 2012-11-08
        相关资源
        最近更新 更多