Значение понятия Plain Old Java Object(POJO) в Java
POJO (англ. Plain Old Java Object) — «старый добрый Java-объект», простой Java-объект, не унаследованный от какого-то специфического объекта и не реализующий никаких служебных интерфейсов сверх тех, которые нужны для бизнес-модели. Получается POJO — это понятие, описывающее класс, который не реализует ни один интерфейс и не расширяет ни один класс, имеет только поля, конструкторы, геттеры и сеттеры?
Отслеживать
задан 27 фев 2017 в 19:46
2,015 4 4 золотых знака 27 27 серебряных знаков 53 53 бронзовых знака
Да, это просто обычный класс.
27 фев 2017 в 19:58
28 фев 2017 в 1:51
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
То что вы описали — это Value Object. POJO — это класс, который не использует специальные возможности различных фреймворков, таких как Spring, EJB и пр. Данные фреймворки появились позже и поэтому в названии присутствует слово «старый».
Отслеживать
ответ дан 27 фев 2017 в 19:54
Mikhail Vaysman Mikhail Vaysman
14.2k 1 1 золотой знак 21 21 серебряный знак 31 31 бронзовый знак
«это класс, который специальные возможности различных фреймворков» — реализует?
27 фев 2017 в 19:56
Скорее не использует .
27 фев 2017 в 20:03
@vp_arth спасибо. исправил.
27 фев 2017 в 20:11
-
Важное на Мете
Связанные
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Разница между POJO, JavaBeans, DTO и VO
В этом руководстве мы узнаем, что такое объект передачи данных (DTO), объект значения (VO), обычный старый объект Java (POJO) и JavaBeans. Мы рассмотрим различия между ними и поймем, какой тип использовать и когда.
2. Обычный старый Java-объект
POJO , также известный как Plain Old Java Object, — это обычный объект Java, который не имеет ссылок на какой-либо конкретный фреймворк. Этот термин используется для обозначения простого легковесного объекта Java.
POJO не использует никаких соглашений об именах для свойств и методов.
Давайте определим базовый объект EmployeePOJO , который имеет три свойства:
public class EmployeePOJO private String firstName; private String lastName; private LocalDate startDate; public EmployeePOJO(String firstName, String lastName, LocalDate startDate) this.firstName = firstName; this.lastName = lastName; this.startDate = startDate; > public String name() return this.firstName + " " + this.lastName; > public LocalDate getStart() return this.startDate; > >
Как мы видим, приведенный выше объект Java определяет структуру для представления сотрудника и не зависит ни от какой структуры.
3. JavaBeans
3.1. Что такое JavaBean?
JavaBean в основном похож на POJO с некоторым строгим набором правил его реализации.
Правила определяют, что он должен быть сериализуемым, иметь нулевой конструктор и разрешать доступ к переменным с помощью методов, соответствующих соглашениям getX() и setX() .
3.2. POJO как JavaBean
Поскольку JavaBean по сути является POJO, давайте преобразуем EmployeePOJO в JavaBean, реализуя необходимые правила компонента:
public class EmployeeBean implements Serializable private static final long serialVersionUID = -3760445487636086034L; private String firstName; private String lastName; private LocalDate startDate; public EmployeeBean() > public EmployeeBean(String firstName, String lastName, LocalDate startDate) this.firstName = firstName; this.lastName = lastName; this.startDate = startDate; > public String getFirstName() return firstName; > public void setFirstName(String firstName) this.firstName = firstName; > // additional getters and setters >
Здесь, чтобы преобразовать POJO в JavaBean, мы реализовали интерфейс Serializable , пометили свойства как private и использовали методы получения/установки для доступа к свойствам.
4. ДТО
4.1. Шаблон DTO
DTO, также называемый объектом передачи данных , инкапсулирует значения для передачи данных между процессами или сетями.
Это помогает сократить количество вызываемых методов. Включая несколько параметров или значений в один вызов, мы уменьшаем нагрузку на сеть при удаленных операциях.
Еще одним преимуществом этого шаблона является инкапсуляция логики сериализации. Это позволяет программе хранить и передавать данные в определенном формате.
DTO не имеет явного поведения. В основном это помогает сделать код слабо связанным, отделив модели предметной области от уровня представления.
4.2. Как использовать ДТО?
DTO имеют плоскую структуру без какой-либо бизнес-логики. Они используют тот же формат, что и POJO. DTO содержит только хранилище, средства доступа и методы, связанные с сериализацией или синтаксическим анализом.
DTO в основном сопоставляются с моделью предметной области и, таким образом, отправляют данные методу или серверу.
Давайте создадим EmployeeDTO , который сгруппирует все необходимые данные для создания сотрудника. Мы отправим эти данные на сервер в одном запросе, который оптимизирует взаимодействие с API:
public class EmployeeDTO private String firstName; private String lastName; private LocalDate startDate; // standard getters and setters >
Вышеупомянутый DTO взаимодействует с различными службами и обрабатывает поток данных. Этот шаблон DTO можно использовать в любой службе без ограничений фреймворка.
5. В.О.
VO, также известный как Value Object, представляет собой объект особого типа, который может содержать такие значения, как java.lang.Integer и java.lang.Long .
ВО всегда должен переопределять методы equals() и hashCode() . ВО обычно инкапсулируют небольшие объекты, такие как числа, даты, строки и т. д. Они следуют семантике значений, т. е. напрямую изменяют значение объекта и передают копии вместо ссылок.
Рекомендуется делать объекты-значения неизменяемыми. Изменение значений происходит только путем создания нового объекта, а не путем обновления значений в самом старом объекте. Это помогает понять неявный контракт, согласно которому два объекта-значения, созданные равными, должны оставаться равными.
Давайте определим EmployeeVO и переопределим методы equals() и hashCode() :
public class EmployeeVO private String firstName; private String lastName; private LocalDate startDate; public EmployeeVO(String firstName, String lastName, LocalDate startDate) this.firstName = firstName; this.lastName = lastName; this.startDate = startDate; > // Getters @Override public boolean equals(Object obj) if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; EmployeeVO emp = (EmployeeVO) obj; return Objects.equals(firstName, emp.firstName) && Objects.equals(lastName, emp.lastName) && Objects.equals(startDate, emp.startDate); > @Override public int hashCode() return Objects.hash(firstName, lastName, startDate); > >
6. Заключение
В этой статье мы увидели определения POJO, JavaBeans, DTO и Value Objects. Мы также увидели, как некоторые платформы и библиотеки используют соглашения об именах JavaBean и как преобразовать POJO в JavaBean. Мы также рассмотрели шаблон DTO и объекты-значения, а также их использование в различных сценариях.
Как всегда, код этих примеров доступен на GitHub .
- 1. Обзор
- 2. Обычный старый Java-объект
- 3. JavaBeans
- 3.1. Что такое JavaBean?
- 3.2. POJO как JavaBean
- 4.1. Шаблон DTO
- 4.2. Как использовать ДТО?
Все, что вам нужно знать о POJO в Java
Эта статья поможет вам понять, что такое POJO в Java, а также предоставит вам подробную практическую демонстрацию по этому вопросу.
Pojo на Яве означает простой старый Объект Java и они используются для повышения читабельности и повторного использования программы. Это обычные java-объекты, не ограниченные особыми ограничениями, кроме тех, которые установлены спецификацией языка Java. Эта статья поможет вам детально изучить предмет,
Следующие указатели будут рассмотрены в этой статье.
Итак, давайте начнем с этой статьи о POJO в Java,
POJO в Java
Проще говоря, Pojo определяется как чистая структура данных, содержащая поля получения и установки. У него есть возможность переопределить определенные методы из Object или интерфейса, такого как Serializable. Они были представлены в EJB 3.0 компанией Sun Microsystems и широко используются, поскольку их легко писать и понимать.
- Расширить предопределенные классы: Ex- public class Test extends javax.servlet.http.HttpServlet не считается классом POJO.
- Содержат предварительно определенные аннотации: Ex- @ javax.persistence.Entity открытый класс Test <..>не является классом pojo.
- Реализуйте предварительно заданные интерфейсы: Ex-открытый класс Test реализует javax.ejb.EntityBean не считается классом POJO.
Продолжая эту статью о POJO в Java,
Данный пример является наглядным примером класса POJO.
(// Студенческий класс POJO для представления сущности Студенческий открытый класс Student/ поле по умолчанию String name // публичное поле public String id // частные сборы частные двойные сборы // аргумент-конструктор для инициализации полей public Student (String name, String id , двойные сборы) // метод получения для name public String getName () // метод получения для id public String getId () // метод получения сборов public Double getFees () >
Видно, что модификаторы доступа к полям не содержат никаких ограничений, т.е. им разрешено быть по умолчанию, защищенными, частными или общедоступными.
Продолжая эту статью о POJO в Java,
Работа POJO
Работу класса POJO можно увидеть ниже. Бизнес-логика, представленная на рисунке, инкапсулирована POJO. Контроллеры взаимодействуют с бизнес-логикой, которая, в свою очередь, взаимодействует с POJO для доступа к базе данных.

Давайте теперь разберемся с Java Beans,
Java Beans
Особые типы Pojos известны как JavaBeans.
- Все JavaBean-компоненты можно рассматривать как Pojos, но не наоборот.
- Они должны реализовать интерфейс Serializable.
- Поля должны быть закрытыми, чтобы обеспечить полный контроль над полями.
- Поля должны иметь геттеры, сеттеры или даже то и другое одновременно.
- Компонент должен содержать конструктор без аргументов.
- Поля могут быть доступны только конструкторам или геттерам и сеттерам.
Продолжая эту статью о POJO в Java,
Получатель и сеттер
Геттер и сеттер можно определить следующим образом:
Геттер
public void getName ()
Сеттер
public void setName (имя)
class Student реализует java.io.Serializable public void setId (int id) public int getId () public void setName (String name ) public String getName () > public class Test >
Вывод
Pojos в java полезны при определении объектов для повышения их читабельности и возможности повторного использования. Никаких других ограничений на них не накладывается.
Бобы, с другой стороны, определяются как Pojos с некоторыми ограничениями.
На этом мы подошли к концу статьи о POJO в Java. Если вы хотите узнать больше, ознакомьтесь с от Edureka, надежной компании онлайн-обучения. Курс обучения и сертификации по Java J2EE и SOA от Edureka разработан, чтобы обучить вас базовым и продвинутым концепциям Java, а также различным средам Java, таким как Hibernate и Spring.
Есть вопрос к нам? Пожалуйста, укажите это в разделе комментариев этого блога, и мы свяжемся с вами как можно скорее.
Категории
- Мобильная Разработка
- Облачные Вычисления
- Большое Количество Данных
- Data Science
- Базы Данных
- Управление Проектами И Методологии
- Bi И Визуализация
- Программирование И Фреймворки
- Искусственный Интеллект
- Без Категории
- Хранилище Данных И Etl
- Системы И Архитектура
- Front End Веб-Разработка
- Devops
- Операционные Системы
- Тестирование Программного Обеспечения
- Блокчейн
- Роботизированная Автоматизация Процессов
- Информационная Безопасность
- Цифровой Маркетинг
- Политика Конфиденциальности
Pojo java что это
POJO – это plain old Java object, простой Java-объект, не ограниченный какими-либо запретами, специфичными для того или иного фреймворка (за исключением спецификации самой Java, разумеется) и пригодный для использования в любой среде.
POJO используются для универсальной и наглядной сериализации и десериализации данных, так что основное их назначение в тестировании с RestAssured – это обработка Json в теле запросов и ответов.
Они позволяют достаточно гибко настраивать содержимое Json-объектов, отправляемых в теле запросов – например можно использовать один POJO-класс для составления Json-объектов с разным набором значений, избежав при этом многократного повторения одного и того же кода, или легко создавать Json-объекты с многоуровневыми вложениями, сохраняя при этом простую и наглядную структуру.
При обработке входящих ответов POJO позволяют извлекать любые необходимые значения для дальнейшего использования, а также дают (как уже было сказано выше – простой и наглядный) доступ к вложенным значениям.
Как их создать и как с ними работать? #
POJO — это публичный класс, все переменные в котором закрыты, а взаимодействие с ними происходит через сеттеры и геттеры. Также у POJO должен быть дефолтный конструктор, определяющий необходимый набор параметров для любого экземпляра этого класса. Соответственно, в самом базовом варианте POJO будет иметь следующий вид:
public class Book < private String title; private String author; public Book() < >public String getTitle() < return title; >public void setTitle(String title) < this.title = title; >public String getAuthor() < return author; >public void setAuthor(String author) < this.author = author; >>Конструктор, как и любой другой метод, можно перегружать. Таким образом можно определить несколько допустимых наборов параметров при создании экземпляра класса. Например, следующие конструкторы позволят создать только книгу без названия и автора или книгу с названием и автором, но не с чем-то одним:
public Book() < >public Book(String title, String author)
Впрочем, ничто не мешает нам создать книгу пустым конструктором, а затем назначить ей только один параметр с помощью сеттера.
Создание экземпляра класса Book происходит следующим образом:
Book book1 = new Book();Book book2 = new Book("War and Peace", "Leo Tolstoy");Использование на практике #
Для демонстрации работы POJO будет использован API Restful Booker, с его документацией можно ознакомиться здесь: https://restful-booker.herokuapp.com/apidoc/index.html
И в исходящих запросах, и во входящих ответах в этом API используется json-объект следующего вида:
< "firstname" : "Jim", "lastname" : "Brown", "totalprice" : 111, "depositpaid" : true, "bookingdates" : < "checkin" : "2018-01-01", "checkout" : "2019-01-01" >, "additionalneeds" : "Breakfast" >Для того чтобы описать этот json, нам нужно создать класс Booking, в котором мы объявим все необходимые переменные, таким же образом, как в приведенном выше примере.
Вы можете заметить, что поле bookingdates содержит в себе два вложенных значения, и у нас нет готового типа данных, который можно было бы присвоить соответствующей ему переменной. Это проблема решается крайне просто: нам всего лишь необходимо создать класс BookingDates:
public class BookingDates < private String checkin; private String checkout; public BookingDates(String checkin, String checkout) < this.checkin = checkin; this.checkout = checkout; >>Теперь у нас есть тип данных, подходящий для поля bookingdates, так что у нас есть все необходимое, чтобы создать класс Booking.
public class Booking < private String firstname; private String lastname; private Integer totalprice; private Boolean depositpaid; private BookingDates bookingdates; private String additionalneeds; public Booking(String firstname, String lastname, Integer totalprice, Boolean depositpaid, BookingDates bookingdates, String additionalneeds) < this.firstname = firstname; this.lastname = lastname; this.totalprice = totalprice; this.depositpaid = depositpaid; this.bookingdates = bookingdates; this.additionalneeds = additionalneeds; >>Точно таким же образом можно описывать и более сложные многоуровневые вложения.
Так как все переменные в обоих классах приватные, а нам понадобится доступ к хранящимся в них значениям, напишем для каждой из них Getter:
public String getFirstname() < return firstname; >public String getLastname() < return lastname; >(и так далее)На этом подготовка POJO заканчивается, и мы можем переходить непосредственно к сериализации и десериализации.
Cериализация #
В качестве примера сериализации с помощью POJO мы сформируем json-объект, который необходимо отправить в POST-запросе на эндпойнт /booking для создания новой брони.
Для этого создадим экземпляры классов Booking и BookingDates со всеми необходимыми для формирования Json-объекта данными:
BookingDates bookingDates = new BookingDates("2021-08-31", "2021-09-10"); Booking booking = new Guest("John", "Doe", 100, true, bookingDates, "Breakfast");Rest Assured прекрасно умеет преобразовывать POJO в Json, так что никаких дополнительных манипуляций над созданным объектом нам не потребуется. Все, что нужно сделать после этого – поместить созданный объект booking в тело нашего запроса:
given() .contentType("application/json") .accept("application/json") .body(booking) .post("https://restful-booker.herokuapp.com/booking") .then() .statusCode(200);Таким образом мы отправляем запрос со следующим содержанием:
< "firstname" : "John", "lastname" : "Doe", "totalprice" : 100, "depositpaid" : true, "bookingdates" : < "checkin" : "2021-08-31", "checkout" : "2021-09-10" >, "additionalneeds" : "Breakfast" >Десериализация #
Для изучения работы десериализации с помощью POJO мы создадим такую же бронь, как до этого, десериализуем ответ от API, извлечем значение bookingid, а затем запросим данные о брони с этим bookingid и сравним из с отправленным json-объектом.
Для начала посмотрим на то, как выглядит ответ на отправленный нами запрос о создании новой брони:
< "bookingid": 36, "booking": < "firstname": "John", "lastname": "Doe", "totalprice": 100, "depositpaid": true, "bookingdates": < "checkin": "2021-08-31", "checkout": "2021-09-10" >, "additionalneeds": "Breakfast" > >Как мы видим, структура json стала чуть сложнее и к ней добавился еще один уровень. По аналогии с предыдущими классами, создадим класс BookingInfo:
public class BookingInfo < private int bookingid; private Booking booking; public BookingInfo() < >public int getBookingid() < return bookingid; >public Booking getBooking() < return booking; >>Также добавляем в уже существующие классы пустые конструкторы:
public BookingDates()
public Booking()
Теперь мы можем сохранить ответ на POST-запрос в переменную, одновременно с этим десериализовав его:
BookingInfo bookingInfo = given() .contentType("application/json") .accept("application/json") .body(body) .post(POST_URI) .then() .extract().body().as(BookingInfo.class);Как видите, процесс десериализации практически идентичен сериализации – Rest Assured можно преобразовать Json в POJO без каких-либо дополнительных действий и библиотек.
Теперь у нас есть экземпляр класса BookingInfo, который содержит в себе всю полученную информацию. Чтобы проверить, что данные действительно сохранились, используем полученный bookingid, чтобы получить информацию о созданной нами брони:
Booking checkBooking = given() .get("https://restful-booker.herokuapp.com/booking/" + bookingInfo.getBookingid()) .then() .extract().body().as(Booking.class);В ответе мы получили верные данные, но чтобы не полагаться на визуальную проверку, сравним полученный Json с тем, который мы создали при формировании POST-запроса.
Самый простой способ это сделать – это привести POJO к строке. Для этого перепишем метод toString() в Booking и BookingDates следующим образом:
@Override public String toString()
@Override public String toString()
А затем сравним полученные строки:
Assert.assertEquals(checkBooking.toString(), bookingInfo.getBooking().toString());Полезные библиотеки #
- Аннотации @Getter и @Setter из библиотеки Lombok
Геттеры и сеттеры занимают довольно много места – особенно в POJO с большим количеством переменных, – не привнося с собой никакой полезной информации. Библиотека Lombok позволяет заменить методы для геттеров и сеттеров аннотацией.
@Getter @Setter public class BookingDates
public class BookingDates < private String checkin; private String checkout; public String getCheckin() < return checkin; >public String getCheckout() < return checkout; >public void setCheckin(String checkin) < this.checkin = checkin; >public void setCheckout(String checkout) < this.checkout = checkout; >>@JsonInclude #
Аннотация JsonInclude позволяет управлять тем, какие параметры будут добавлены или исключены из итогового json-объекта. Она может применяться как ко всему классу, так и к отдельным переменным, и может принимать значения ALWAYS (всегда включать), NON_NULL (исключить параметры равные null), NON_EMPTY (исключить null, а так же пустые списки/массивы), * NON_DEFAULT/USE_DEFAULTS* (не использовать/использовать значения по умолчанию), *CUSTOM* (использовать кастомный фильтр) .
Например, аннотация @JsonInclude(JsonInclude.Include.NON_NULL) для всего POJO позволяет использовать один класс для нескольких вариантов json-схем. Для этого нужно просто передать null в тех параметрах, которые не нужны для конкретной схемы, и они будут исключены из финального json.
@JsonProperty #
Аннотация @JsonProperty позволяет указать, к какому параметру относится геттер или сеттер в том случае, когда по какой-то причине необходимо использовать метод с нестандартным именем:
private String checkin; @JsonProperty("checkin") public String getDate()@JsonAlias #
@JsonAlias позволяет сохранять параметры с разными вариантами написания в одну переменную.
@JsonAlias(< "firstName", "name" >) private String firstname;В данном случае в переменную firstname может быть записано значение с любым из трех указанных выше ключей: firstname, firstName и name.
Аннотация @JsonAlias отлично помогает справляться с не консистентными json-схемами, в которых одни и те же значения записаны под разными ключами.
@JsonIgnoreProperties и @JsonIgnore #
Обе эти аннотации указывают на переменные, которые должны быть проигнорированы при сериализации или десериализации.
@JsonIgnoreProperties используется для всего класса:
@JsonIgnoreProperties(< "bookingid" >) public class BookingInfo
@JsonIgnore используется над переменной, которую необходимо исключить:
private int bookingid; @JsonIgnore private Booking booking;- Package org.hamcrest.beans из библиотеки Hamcrest
hasProperty #
Метод hasProperty() позволяет проверить, есть ли в экземпляре класса указанный параметр:
assertThat(bookingInfo, hasProperty("bookingid"))assertThat(bookingInfo, hasProperty("bookingid", equalTo(15))samePropertyValuesAs #
Метод samePropertyValuesAs() позволяет сравнить два экземпляра одного или разных классов.
assertThat(bookingInfo, samePropertyValuesAs(bookingInfoCheck))Однако стоит отметить, что этот метод корректно работает только с простыми POJO без вложенных классов.
Увидел(а) ошибку в тексте? Нет нужной информации или она не полная?
Скорей же исправь данный недочет и облегчи жизнь себе и своей команде!
Обязательно ознакомься с тем как заполнить bugаж знаний и после создавай МР в проекте bugаж знаний на своего QA Team Lead.