2015-02-25 1 views
0

Я реализую библиотеку для сетевого протокола, которая включает в себя отправку данных с постоянной частотой 50 Гц. Фактическая передача данных будет осуществляться по отдельному потоку. В составе библиотеки будет класс, который представляет все данные, которые необходимо отправить, и библиотека позаботится о его сериализации и передаче.Отправка сетевых данных, измененная и неизменяемая структура данных

Моя проблема заключается в том, что я не уверен, как создать этот класс данных. Варианты, о которых я думал, были:

  • Одиночный изменяемый объект. Посылающий поток блокирует объект, сериализует его, а затем разблокирует, чтобы клиент мог снова его модифицировать. Я думаю, что это, наверное, самый худший вариант.
  • Mutable object, который клонируется библиотекой при передаче в качестве аргумента. Таким образом, вызывающий метод может модифицировать существующий объект, не мешая потоку отправки.
  • Неизменяемый объект, поэтому новый должен быть создан каждый раз вызывающим методом и повторно заполнен данными.

Я не был уверен в том, что вы собираетесь клонировать маршрут, так как новый объект должен быть создан и заполнен 50 раз в секунду.

Для вариантов клонирования мне также интересно, какой лучший способ клонировать такой объект. Должен ли я использовать Object.clone(), о котором я слышал смешанные вещи, или реализовать собственный метод/конструктор копирования? Если я сделаю что-то обычай, какой будет самый надежный способ его реализации? В принципе, мне придется писать в коде, чтобы копировать каждое поле исходного объекта по одному, и я надеялся, что будет более простой способ сделать это.

+0

Это зависит от того, насколько велики эти объекты, но обычный ПК может создавать миллионы объектов в секунду. Поэтому создание 50 объектов в секунду вряд ли станет проблемой производительности. – Jesper

+0

Мое намерение состояло в том, чтобы использовать эту библиотеку как на смартфоне, так и на ПК. Будет ли клонирование 50 раз/сек проблемой для современных смартфонов? – AniDev

ответ

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 
} 
+0

Итак, для метода clone мне нужно написать код для копирования каждого поля или супер.clone() сделать мелкую копию всех полей автоматически? Из вашего примера кода это похоже на то, что происходит, а затем вручную копировать, где мелкой копии недостаточно. – AniDev

0
  • одноместного изменяемого объект блокированной нить: вам нужно будет реализовать фиксирующий и если Механизм, у вас есть утечка ваших объектов могут быть легко повреждены.
  • Мутируемый объект клонирован: вам нужно будет реализовать клонирование mecanism, которое может быть сложным. К счастью, для этого есть несколько решений. Посмотрите на Java: recommended solution for deep cloning/copying an instance
  • неизменяемого объекта: вам нужно будет реализовать неизменный объект, например, следующие http://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html

Я бы с изменяемым объектом клонированного, поскольку она поддерживает исходный объект. С помощью этого решения вы можете клонировать свой объект, чтобы отправить его и изменить исходный объект для следующей задачи отправки.

Клонирование mecanism не должно быть проблемой производительности, так как клонирование 50 объектов в секунду не должно быть проблемой для любой современной системы (хотя я не знаю, в какой системе вы работаете).

+0

Спасибо за эту ссылку о методах клонирования, она будет очень полезной. Я думаю, что самая легкая вещь для меня, вероятно, будет клонировать каждое поле за строкой, а не вносить библиотеку. – AniDev