Перейти к содержимому

Pojo java что это

  • автор:

Значение понятия 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

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

    Продолжая эту статью о POJO в Java,

    Работа POJO

    Работу класса POJO можно увидеть ниже. Бизнес-логика, представленная на рисунке, инкапсулирована POJO. Контроллеры взаимодействуют с бизнес-логикой, которая, в свою очередь, взаимодействует с POJO для доступа к базе данных.

    POJO _ POJO в Java - Edureka

    Давайте теперь разберемся с 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *