Какой бы самый быстрый способ копирования данных между объектами Java? - PullRequest
2 голосов
/ 15 июля 2011

У меня есть различные наборы объектов Java, некоторые из них pojos, сгенерированные из инструментов JAXB, некоторые из них - доменные классы и т. Д. В большом приложении мне нужно получить данные из одного набора объектов и поместить в другой набор объектов.которые имеют разные возможности для использования данных.

Существуют различные способы сделать это: рамки отображения объектов являются очевидным выбором.Тем не менее, большинство этих фреймворков с твердой базой кода и сообществом используют отражение. (Например, dozer)

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

Можете ли вы придумать какой-нибудь другой метод?Какая-то сериализация в байтовый массив в памяти, а затем десериализация?Могут ли они превзойти копии, основанные на посетителях, с точки зрения производительности?Я несправедлив по отношению к подходам, основанным на рефлексии, таких как Dozer?Это ключевая операция в приложении, поэтому любые улучшения могут значительно улучшить общую производительность.

Ответы [ 4 ]

2 голосов
/ 15 июля 2011

Шаблон посетителей должен быть почти оптимальным для производительности. Все, что связано с сериализацией, будет хуже из-за издержек любого вида обобщенного отображения.

Я не совсем знаком с dozer - но отражение не должно быть таким огромным хитом, если оно используется по существу для автоматизации написания кода, который вы делаете вручную; то есть, если он генерирует класс (или эквивалентное логическое дерево) один раз, чтобы определить операцию копирования, а затем запускает это повторно. Затраты на отражение амортизируются по большому количеству операций и становятся незначительными.

1 голос
/ 15 июля 2011

Адаптер шаблона Facade будет хорошей идеей.Чем меньше вы копируете данные - тем лучше.Кроме того, это хорошая идея, чтобы сделать ваши данные неизменяемыми, чтобы вы могли избежать проблем параллелизма в будущем.

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

1 голос
/ 15 июля 2011

В конце концов, вам действительно нужен тест и минимальные требования.

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

Для каждого «быстрого» пути всегда есть другой способ, который может быть немного быстрее.Заявление о минимальных требованиях быстро говорит вам, нужно ли это быстро (или вы просто оптимизируете преждевременно), и когда прекратить вкладывать ресурсы, чтобы сделать это еще быстрее.но прочитайте его, прежде чем пытаться (так как создание плохого теста нелепо легко).

0 голосов
/ 15 июля 2011

Если все, что вас беспокоит, это передача данных, а не фактическое создание составного объекта полей из двух разных классов, тогда я предлагаю фасад. Фасад будет направлен на несколько разных объектов и вернет один объект передачи данных (DTO) из двух.

http://en.wikipedia.org/wiki/Facade_pattern

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

Я обычно начинаю здесь:

http://www.javacamp.org/designPattern/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...