Разница между DTO, VO, POJO, JavaBeans?


584

Видели несколько похожих вопросов:

Можете ли вы также сказать мне контексты, в которых они используются? Или цель их?


1
POJO поставляется без ограничений, тогда как javabeans идет с ограничениями, упомянутыми выше
exexzian

Ответы:


848

JavaBeans

JavaBean - это класс, который следует соглашениям JavaBeans, определенным Sun. В Википедии есть довольно хорошее резюме о том, что такое JavaBeans :

JavaBeans - это повторно используемые программные компоненты для Java, которыми можно визуально манипулировать в инструменте компоновщика. На практике это классы, написанные на языке программирования Java, соответствующем определенному соглашению. Они используются для инкапсуляции многих объектов в один объект (бин), чтобы их можно было передавать как один объект бина, а не как несколько отдельных объектов. JavaBean - это Java-объект, который сериализуем, имеет нулевой конструктор и предоставляет доступ к свойствам с использованием методов получения и установки.

Чтобы функционировать как класс JavaBean, объектный класс должен подчиняться определенным соглашениям относительно именования методов, конструкции и поведения. Эти соглашения позволяют иметь инструменты, которые могут использовать, повторно использовать, заменять и подключать JavaBeans.

Требуемые соглашения:

  • Класс должен иметь открытый конструктор по умолчанию. Это позволяет легко создавать экземпляры в рамках редактирования и активации.
  • Свойства класса должны быть доступны, используя get, set и другие методы (так называемые методы доступа и методы мутатора), следуя стандартному соглашению об именах. Это позволяет легко автоматизировать проверку и обновление состояния компонента в рамках, многие из которых включают настраиваемые редакторы для различных типов свойств.
  • Класс должен быть сериализуемым. Это позволяет приложениям и инфраструктурам надежно сохранять, хранить и восстанавливать состояние компонента в зависимости от виртуальной машины и платформы.

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

POJO

Простой старый Java-объект или POJO - это термин, первоначально введенный для обозначения простого облегченного Java-объекта, не реализующего никакого javax.ejbинтерфейса, в отличие от тяжелого EJB 2.x (особенно Entity Beans, Session Beans без состояния не так уж плохи для IMO). Сегодня этот термин используется для обозначения любого простого объекта без лишних вещей. Опять же, Википедия делает хорошую работу по определению POJO :

POJO является аббревиатурой от Plain Old Java Object. Имя используется, чтобы подчеркнуть, что рассматриваемый объект является обычным Java-объектом, а не специальным объектом и, в частности, не Enterprise JavaBean (особенно до EJB 3). Термин был придуман Мартином Фаулером, Ребеккой Парсонс и Джошем Маккензи в сентябре 2000 года:

«Мы удивлялись, почему люди были против использования обычных объектов в своих системах, и пришли к выводу, что причина в том, что простым объектам не хватает причудливого имени. Поэтому мы дали им одно, и оно очень хорошо прижилось».

Этот термин продолжает шаблон более старых терминов для технологий, которые не используют необычные новые функции, такие как POTS (простая старая телефонная служба) в телефонии и PODS (простые старые структуры данных), которые определены в C ++, но используют только функции языка C, и POD (простая старая документация) на Perl.

Этот термин, скорее всего, получил широкое признание из-за необходимости общего и легко понятного термина, который контрастирует со сложными объектными структурами. JavaBean - это POJO, который является сериализуемым, имеет конструктор без аргументов и предоставляет доступ к свойствам с использованием методов получения и установки. Enterprise JavaBean - это не отдельный класс, а целая модель компонентов (опять же, EJB 3 уменьшает сложность Enterprise JavaBeans).

Поскольку конструкции, использующие POJO, стали более широко используемыми, возникли системы, которые предоставляют POJO некоторые функциональные возможности, используемые в каркасах, и расширяют выбор того, какие области функциональности действительно необходимы. Hibernate и Spring являются примерами.

Объект значения

Объект Value или VO - это такой объект, java.lang.Integerкоторый содержит значения (следовательно, объекты значений). Для более формального определения я часто обращаюсь к описанию Мартина Фаулера Value Object :

В Паттернах Архитектуры Приложения Предприятия я описал Объект Ценности как маленький объект, такой как Деньги или объект диапазона дат. Их ключевое свойство заключается в том, что они следуют семантике значений, а не ссылочной семантике.

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

Общая эвристика заключается в том, что объекты значения должны быть полностью неизменными. Если вы хотите изменить объект значения, вы должны заменить объект новым и не иметь права обновлять значения самого объекта значения - обновляемые объекты значения приводят к проблемам с наложением имен.

В ранней литературе по J2EE термин объект значения использовался для описания другого понятия, которое я называю объектом передачи данных . С тех пор они изменили свое использование и вместо этого используют термин Transfer Object .

Вы можете найти более хороший материал по ценным объектам в вики и Дирке Риле .

Объект Передачи Данных

Data Transfer Object или DTO - это (анти) шаблон, представленный в EJB. Вместо того чтобы выполнять много удаленных вызовов в EJB, идея заключалась в том, чтобы инкапсулировать данные в объект значения, который можно передать по сети: объект передачи данных. В Википедии есть достойное определение объекта передачи данных :

Объект передачи данных (DTO), ранее известный как объекты значений или VO, - это шаблон проектирования, используемый для передачи данных между подсистемами прикладных программ. DTO часто используются вместе с объектами доступа к данным для извлечения данных из базы данных.

Разница между объектами передачи данных и бизнес-объектами или объектами доступа к данным заключается в том, что DTO не имеет никакого поведения, за исключением хранения и извлечения своих собственных данных (средства доступа и мутаторы).

В традиционной архитектуре EJB DTO служат двойным целям: во-первых, они решают проблему невозможности сериализации объектных компонентов; во-вторых, они неявно определяют фазу сборки, на которой все данные, которые будут использоваться представлением, выбираются и направляются в DTO перед возвратом управления на уровень представления.


Таким образом, для многих людей DTO и VO - это одно и то же (но Фаулер использует VO для обозначения чего-то другого, как мы видели). В большинстве случаев они следуют соглашениям JavaBeans и, таким образом, также являются JavaBeans. И все это POJO.


1
Поэтому, если у меня есть вспомогательный класс, созданный просто для передачи несвязанных данных, таких как этот, class SomeClass { public String foo;public String bar; }внутри класса со сложной логикой, наверняка это не JavaBean, это не может быть VO, поскольку он изменчив, может ли это быть DTO? Хотя он не предназначен для удаленных вызовов любого рода. Можно ли считать это POJO?
Хайме Хаблутцель

3
@ user2601512: Это все еще будет Боб. : P Нет ничего плохого в том, что у Бина есть такое поведение - на самом деле, это вполне ожидаемо. Если это ничего не делает, это в основном DTO.
Чао

7
@xSNRG: Отчасти потому, что он понижает объекты до данных, на которые воздействует другой код. Это шаг назад с точки зрения ОО, когда объекты действуют и должны нести ответственность за свое собственное состояние. DTO иногда являются достойным решением, если вы на самом деле просто переносите данные - отсюда и название - но инкапсуляция в основном выходит за рамки, и вы обычно теряете любые гарантии достоверности / согласованности, которые может обеспечить реальный объект.
Чао

1
@ KumaresanPerumal: Вы можете, если хотите. Но модель отличается от уровня данных и имеет разные цели и правила. Слой данных, как правило, нуждается в том, чтобы все было продуманно и произвольно настраиваться, а модель в идеале хочет скрыть данные и применить инварианты. Вы хотите использовать объекты моделей для хранения, вам придется идти на компромисс с одной или другой стороны.
cHao

1
@KumaresanPerumal: слой данных для хранения и извлечения данных. Для этого почти необходим полный доступ к любому объекту, в котором хранятся данные, поскольку поиск означает установку значений в объекте где-либо. Но модель управляет этими данными в системе и связана с принципами ОО, такими как инкапсуляция - идея о том, что объекты должны сохранять контроль над своим внутренним состоянием и не иметь другого кода, произвольно связанного с их внутренностями. ОТО могут преодолеть этот разрыв; слой данных может получить к ним доступ по желанию, и модель не должна отказываться от контроля.
cHao

66

DTO против VO

DTO - Объекты передачи данных - это просто контейнеры данных, которые используются для передачи данных между уровнями и уровнями.

  • Он в основном содержит атрибуты. Вы даже можете использовать публичные атрибуты без методов получения и установки.
  • Объекты передачи данных не содержат никакой бизнес-логики.

Аналогия:
Простая форма регистрации с атрибутами username, password и email id.

  • Когда эта форма отправляется в файл RegistrationServlet, вы получаете все атрибуты от уровня представления до бизнес-уровня, где вы передаете атрибуты Java-бинам, а затем в DAO или постоянный уровень.
  • DTO помогает в переносе атрибутов с уровня представления на уровень бизнеса и, наконец, на уровень персистентности.

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

DTO часто java.io.Serializable- для передачи данных через JVM.

VO - Объект значения [1] [2] представляет собой фиксированный набор данных и похож на перечисление Java. Идентичность объекта-значения основана на их состоянии, а не на идентичности объекта и является неизменной. Примером реального мира могут быть Color.RED, Color.BLUE, SEX.FEMALE и т. Д.

POJO против JavaBeans

[1] Java-Beanness POJO состоит в том, что все его частные атрибуты доступны через общедоступные методы получения и установки, которые соответствуют соглашениям JavaBeans. например

    private String foo;
    public String getFoo(){...}
    public void setFoo(String foo){...}; 

[2] JavaBeans должен реализовывать Serializable и иметь конструктор без аргументов, тогда как в POJO таких ограничений нет.


Извините за комментарий оооочень поздно, но я узнаю о различиях между ними, и у меня есть вопрос. Что делать, если у меня есть класс Java Bean, но с другими методами, такими как doSomething (). Какой это будет класс? С
наилучшими

@srinivas, почему мы не можем передать данные в Java-объект DOMAIN или MODEL? Но я использую МОДЕЛЬ без DTO. пожалуйста, объясните мне кратко. спасибо
Кумаресан Перумал

46

В принципе,

DTO: «Объекты передачи данных» могут перемещаться между отдельными уровнями в архитектуре программного обеспечения.

VO: «Объекты стоимости» содержат такие объекты, как Integer, Money и т. Д.

POJO: Простой старый Java-объект, который не является специальным объектом.

Java Beans: требует, чтобы a Java Classбыл сериализуемым, имел no-argконструктор, геттер и сеттер для каждого поля


Эти описания в основном неверны / неполны.
виолончель

24

Java Beans - это не то же самое, что EJB.

Спецификация JavaBeans в Java 1.0 была попыткой Sun позволить объектам Java манипулировать в IDE, которая выглядела как VB. Были правила, установленные для объектов, которые квалифицируются как «Java Beans»:

  1. Конструктор по умолчанию
  2. Получатели и установщики для частных членов данных, которые следовали надлежащему соглашению об именах
  3. Сериализуемый
  4. Может быть, другие, которые я забыл.

EJB пришли позже. Они объединяют распределенные компоненты и транзакционную модель, работающие в контейнере, который управляет потоками, пулами, жизненным циклом и предоставляет сервисы. Они очень далеки от Java Beans.

DTO возникли в контексте Java, потому что люди узнали, что спецификация EJB 1.0 слишком «болтлива» с базой данных. Вместо того, чтобы делать обходные шаги для каждого элемента данных, люди будут упаковывать их в Java Beans оптом и отправлять их вокруг.

POJO были реакцией против EJB.


1
Я ошибся и предпочел удалить свое сообщение. Спасибо за исправление. Хочу заметить, что значение POJO изменилось некоторое время назад. Во-первых, они сделаны только из частной собственности и их принадлежностей. Теперь мы рассматриваем POJO как класс с аннотациями, реализующими и расширяющими другие классы и т. Д.
sinuhepop,

Как насчет ВО, как задан вопрос? Это не ответ, пока он не ответит на полный вопрос
виолончель

4

POJO : Это Java-файл (класс), который не расширяет и не реализует какой-либо другой Java-файл (класс).

Bean : Это Java-файл (класс), в котором все переменные являются закрытыми, методы являются общедоступными, и для доступа к переменным используются соответствующие методы получения и установки.

Обычный класс : это Java-файл (класс), который может состоять из открытых / закрытых / стандартных / защищенных переменных и который может расширять или не расширять или реализовывать другой Java-файл (класс).


Как насчет ВО, как задан вопрос? Это не ответ, пока он не ответит на полный вопрос
виолончель

1

Первый разговор о

Нормальный класс - это означает, что любой класс определяет это, как правило, в Java, это означает, что вы создаете другой тип свойств метода и т. Д.
Бин - Бин - это ничто, это всего лишь объект этого конкретного класса, с помощью этого бина вы можете получить доступ к своему классу Java так же, как к объекту. ,

и после этого поговорим о последнем POJO

POJO - POJO - это тот класс, который не имеет никаких сервисов, у него есть только конструктор по умолчанию и частное свойство, а также это свойство для установки значения, соответствующего методам setter и getter. Это короткая форма простого Java-объекта.


Как насчет ВО, как задан вопрос? Это не ответ, пока он не ответит на полный вопрос
виолончель

1
  • Value Object : используйте, когда необходимо измерить равенство объектов на основе значения объектов.
  • Объект передачи данных: передача данных с несколькими атрибутами в одном кадре от клиента к серверу через слой, чтобы избежать нескольких вызовов на удаленный сервер.
  • Простой старый Java-объект : это как простой класс, свойства которого, общедоступный конструктор без аргументов. Как мы заявляем для субъекта JPA.

Разница между ними значением объектно-шаблоны и-данные передачи-паттерн

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.