发送网络数据,可变与不可变数据结构

时间:2015-02-25 07:39:33

标签: java data-structures clone network-protocols

我正在实现一个网络协议库,它涉及以50Hz的恒定速率发送数据。实际的数据传输将在一个单独的线程上完成。作为库的一部分,将有一个表示需要发送的所有数据的类,库将负责序列化并传输它。

我的问题是我不确定如何设计这个数据类。我想到的选项是:

  • 单个可变对象。发送线程将锁定对象,序列化它,然后解锁它,以便客户端可以再次修改它。我认为这可能是最糟糕的选择。
  • 可变对象,当作为参数传递时由库克隆。这样调用方法可以在不干扰发送线程的情况下修改现有对象。
  • 不可变对象,因此每次调用方法都必须创建一个新对象,并重新填充数据。

我不确定是否要进行克隆路由,因为必须每秒创建一个新对象并填充50次。

对于克隆选项,我还想知道克隆像这样的对象的最佳方法是什么。我应该利用Object.clone(),我听说过混合的东西,或者实现自定义复制方法/构造函数?如果我定制一些东西,那么最强大的实现方法是什么?基本上,我必须在代码中写一个一个地复制源对象的每个字段,我希望有一些更简单的方法。

2 个答案:

答案 0 :(得分:0)

我选择了一个可变对象和克隆。如果没有克隆,你就会有潜在的数据损坏,并且使你的类不可变会增加复杂性,这可能是没有根据的。

是的,您的班级应实施Cloneable并覆盖Object.clone()。如果您的任何实例变量类型是可变的,您也应该克隆它们。例如:

class Data implements Cloneable {
    private int i; // int type is immutable
    private String s; // String type is immutable
    private List<String> l; // List type is mutable

    @Override
    public Data clone() {
        try {
            Data clone = (Data) super.clone();
            clone.l = new ArrayList<String>(l); // copy the mutable list
            return clone;
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e); // impossible
        }
    }

    // other class members
}

答案 1 :(得分:0)

我会使用克隆的可变对象,因为它维护原始对象。使用此解决方案,您可以克隆对象以发送它并修改原始对象以进行下一个发送任务。

克隆机制不应该是性能问题,因为每秒克隆50个对象对任何现代系统都不应该是一个问题(虽然我不知道你在做什么系统)。