pojo java что это такое
Что такое класс POJO?
Знание разницы между POJO и JavaBean может быть ключом к раскрытию потенциала наших классов в ядре Java.
1. Обзор
В этом коротком уроке мы рассмотрим определение “Простого старого объекта Java” или POJO для краткости.
Мы рассмотрим, как POJO сравнивается с JavaBean, и как превращение наших POJO в JavaBean может быть полезным.
2. Простые Старые объекты Java
2.1. Что такое POJO?
Когда мы говорим о POJO, то описываем простой тип без ссылок на какие-либо конкретные фреймворки. У POJO нет соглашения об именовании для наших свойств и методов.
Давайте создадим базовое POJO для сотрудников. У него будет три свойства: имя, фамилия и дата начала:
Этот класс может использоваться любой программой Java, так как он не привязан ни к какому фреймворку.
Но мы не следуем какому-либо реальному соглашению для построения, доступа или изменения состояния класса.
Это отсутствие соглашения вызывает две проблемы:
Во-первых, это увеличивает кривую обучения для программистов, пытающихся понять, как ее использовать.
Во-вторых, это может ограничить способность фреймворка отдавать предпочтение соглашению перед конфигурацией, понимать, как использовать класс, и расширять его функциональность.
2.2. Отражение с помощью POJO
А теперь давайте проверим свойства нашего POJO:
Если бы мы распечатали имена свойств на консоли, мы бы увидели только:
Здесь мы видим, что мы получаем start только как свойство класса. PropertyUtils не удалось найти два других.
Мы бы увидели такой же результат, если бы использовали другие библиотеки, такие как Jackson для обработки Employee Pojo.
3. JavaBeans
3.1. Что такое JavaBean?
JavaBean по-прежнему является POJO, но вводит строгий набор правил относительно того, как мы его реализуем:
3.2. EmployeePojo как JavaBean
Итак, давайте попробуем преобразовать Employee Pojo в JavaBean:
3.3. Отражение с помощью JavaBean
Когда мы проверяем наш боб с отражением, теперь мы получаем полный список свойств:
4. Компромиссы При Использовании JavaBeans
Итак, мы показали способ, с помощью которого JavaBeans полезны. Имейте в виду, что каждый выбор дизайна сопровождается компромиссами.
Когда мы используем JavaBeans, мы также должны помнить о некоторых потенциальных недостатках:
Учитывая эти компромиссы, фреймворки также адаптировались к другим конвенциям bean на протяжении многих лет.
5. Заключение
В этом уроке мы сравнили POJOs с JavaBeans.
Во-первых, мы узнали, что POJO-это объект Java, который не привязан к какой-либо конкретной структуре, и что JavaBean-это особый тип POJO со строгим набором соглашений.
Затем мы увидели, как некоторые фреймворки и библиотеки используют соглашение об именовании JavaBean для обнаружения свойств класса.
Классы poji, pojo и Java Beans в Java
POJI в Java
Является аббревиатурой от Plain Old Java Interface, который соответствует стандартному интерфейсу Java, что означает, что эти интерфейсы находятся в контексте предоставления услуг в JEE. Например, услуга OSGI предлагается через POJI в JEE
Другими словами, мы можем сказать, что POJI – это обычный интерфейс без какой-либо специальности, которая не унаследована от какого-либо специального API-интерфейса технологии или интерфейсов платформы.
Пример 1
Оба интерфейса будут называться POJI, поскольку они не наследуют какой-либо технологический интерфейс.
Пример 2
Оба интерфейса не будут называться POJI, поскольку они наследуют специфический для технологии интерфейс.
POJO против Java Beans в Java
Как мы знаем, в Java POJO ссылается на простой старый объект Java. POJO и класс Bean в Java имеют некоторые общие черты, а именно:
Единственное различие между обоими классами состоит в том, что Java делает объекты Java-бинов сериализованными, чтобы в случае необходимости можно было сохранить состояние класса бинов. Поэтому из-за этого класс Java-бинов должен реализовывать интерфейс Serializable или Externalizable.
В связи с этим указывается, что все JavaBean-компоненты являются POJO, но не все POJO-объекты являются JavaBean-компонентами.
Пример класса Java Bean
Пример класса POJO
Средняя оценка / 5. Количество голосов:
Или поделись статьей
Видим, что вы не нашли ответ на свой вопрос.
Урок 9. Создание POJO объекта User. Работа с View из java кода
Видео версия урока
Создание View объектов в java коде. Связывание их с xml объектами
Зачем нам это необходимо? На этапе создания layout файла мы можем не обращаться к java коду вообще. Но в обычном приложении все данные поступают в layout динамически из java кода. Поэтому давайте создадим метод displayUserInfo() и там просто присвоим нашим View какое-то временное содержимое. Этот методм нам нужно будет вызывать всякий раз, когда мы захотим обновить информацию на нашем экране:
Добавление POJO объекта User.
Единственное, что нам осталось сделать – это добавить объект, который будет представлять все данные, которыми обладает пользователь. В нашем случае нам нужны следующие поля:
Назовём наш пакет pojo :
Видим, что у нас создался класс и мы можем добавлять в него свой код:
Отлично, давайте добавим поля, которые мы перечислили:
Поэтому, чтобы установить значения полям, мы создадим конструктор.
После этого необходимо выбрать поля, которые мы хотим получать в конструкторе. В нашем случае – это все поля, поэтому выбираем все:
В появившемся окне нажимаем OK и видим, что конструктор сгенерировался автоматически.
Также (т.к. поля у нас private ) нам необходимо создать getter методы для всех полей. Давайте тоже сделаем это автоматически.
По аналогии с генерацией конструктора:
Наш класс теперь выглядит так:
Таким образом, у нас сгенерировались эти два метода:
Если вы не переопределите эти два методы, то объекты будут сравниваться по ссылке, иначе по тому алгоритму, который описан в этих методах.
Использование POJO User в UserInfoActivity
Видим, что в этом методе мы просто возвращаем в этом объекте все те же самые значения, которые мы использовали до этого.
Также нам надо немного изменить метод отображения данных пользователя. Надо добавить объект User как входной параметр и отображать данные из его полей:
Итоговый код нашей UserInfoActivity :
Запустим приложение и увидим, что все поля объекта успешно отобразились:
Pojo java что это такое
POJO – это plain old Java object, простой Java-объект, не ограниченный какими-либо запретами, специфичными для того или иного фреймворка (за исключением спецификации самой Java, разумеется) и пригодный для использования в любой среде.
POJO используются для универсальной и наглядной сериализации и десериализации данных, так что основное их назначение в тестировании с RestAssured – это обработка Json в теле запросов и ответов.
Они позволяют достаточно гибко настраивать содержимое Json-объектов, отправляемых в теле запросов – например можно использовать один POJO-класс для составления Json-объектов с разным набором значений, избежав при этом многократного повторения одного и того же кода, или легко создавать Json-объекты с многоуровневыми вложениями, сохраняя при этом простую и наглядную структуру.
При обработке входящих ответов POJO позволяют извлекать любые необходимые значения для дальнейшего использования, а также дают (как уже было сказано выше – простой и наглядный) доступ к вложенным значениям.
Как их создать и как с ними работать? #
Конструктор, как и любой другой метод, можно перегружать. Таким образом можно определить несколько допустимых наборов параметров при создании экземпляра класса. Например, следующие конструкторы позволят создать только книгу без названия и автора или книгу с названием и автором, но не с чем-то одним:
Впрочем, ничто не мешает нам создать книгу пустым конструктором, а затем назначить ей только один параметр с помощью сеттера.
Создание экземпляра класса Book происходит следующим образом:
Использование на практике #
Для демонстрации работы POJO будет использован API Restful Booker, с его документацией можно ознакомиться здесь: https://restful-booker.herokuapp.com/apidoc/index.html
И в исходящих запросах, и во входящих ответах в этом API используется json-объект следующего вида:
Для того чтобы описать этот json, нам нужно создать класс Booking, в котором мы объявим все необходимые переменные, таким же образом, как в приведенном выше примере.
Вы можете заметить, что поле bookingdates содержит в себе два вложенных значения, и у нас нет готового типа данных, который можно было бы присвоить соответствующей ему переменной. Это проблема решается крайне просто: нам всего лишь необходимо создать класс BookingDates:
Теперь у нас есть тип данных, подходящий для поля bookingdates, так что у нас есть все необходимое, чтобы создать класс Booking.
Точно таким же образом можно описывать и более сложные многоуровневые вложения.
Так как все переменные в обоих классах приватные, а нам понадобится доступ к хранящимся в них значениям, напишем для каждой из них Getter:
На этом подготовка POJO заканчивается, и мы можем переходить непосредственно к сериализации и десериализации.
Cериализация #
В качестве примера сериализации с помощью POJO мы сформируем json-объект, который необходимо отправить в POST-запросе на эндпойнт /booking для создания новой брони.
Для этого создадим экземпляры классов Booking и BookingDates со всеми необходимыми для формирования Json-объекта данными:
Rest Assured прекрасно умеет преобразовывать POJO в Json, так что никаких дополнительных манипуляций над созданным объектом нам не потребуется. Все, что нужно сделать после этого – поместить созданный объект booking в тело нашего запроса:
Таким образом мы отправляем запрос со следующим содержанием:
Десериализация #
Для изучения работы десериализации с помощью POJO мы создадим такую же бронь, как до этого, десериализуем ответ от API, извлечем значение bookingid, а затем запросим данные о брони с этим bookingid и сравним из с отправленным json-объектом.
Для начала посмотрим на то, как выглядит ответ на отправленный нами запрос о создании новой брони:
Как мы видим, структура json стала чуть сложнее и к ней добавился еще один уровень. По аналогии с предыдущими классами, создадим класс BookingInfo:
Также добавляем в уже существующие классы пустые конструкторы:
Теперь мы можем сохранить ответ на POST-запрос в переменную, одновременно с этим десериализовав его:
Как видите, процесс десериализации практически идентичен сериализации – Rest Assured можно преобразовать Json в POJO без каких-либо дополнительных действий и библиотек.
Теперь у нас есть экземпляр класса BookingInfo, который содержит в себе всю полученную информацию. Чтобы проверить, что данные действительно сохранились, используем полученный bookingid, чтобы получить информацию о созданной нами брони:
В ответе мы получили верные данные, но чтобы не полагаться на визуальную проверку, сравним полученный Json с тем, который мы создали при формировании POST-запроса.
Самый простой способ это сделать – это привести POJO к строке. Для этого перепишем метод toString() в Booking и BookingDates следующим образом:
А затем сравним полученные строки:
Полезные библиотеки #
Геттеры и сеттеры занимают довольно много места – особенно в POJO с большим количеством переменных, – не привнося с собой никакой полезной информации. Библиотека Lombok позволяет заменить методы для геттеров и сеттеров аннотацией.
@JsonInclude #
Например, аннотация @JsonInclude(JsonInclude.Include.NON_NULL) для всего POJO позволяет использовать один класс для нескольких вариантов json-схем. Для этого нужно просто передать null в тех параметрах, которые не нужны для конкретной схемы, и они будут исключены из финального json.
@JsonProperty #
Аннотация @JsonProperty позволяет указать, к какому параметру относится геттер или сеттер в том случае, когда по какой-то причине необходимо использовать метод с нестандартным именем:
@JsonAlias #
@JsonAlias позволяет сохранять параметры с разными вариантами написания в одну переменную.
В данном случае в переменную firstname может быть записано значение с любым из трех указанных выше ключей: firstname, firstName и name.
Аннотация @JsonAlias отлично помогает справляться с не консистентными json-схемами, в которых одни и те же значения записаны под разными ключами.
@JsonIgnoreProperties и @JsonIgnore #
Обе эти аннотации указывают на переменные, которые должны быть проигнорированы при сериализации или десериализации.
@JsonIgnoreProperties используется для всего класса:
@JsonIgnore используется над переменной, которую необходимо исключить:
hasProperty #
Метод hasProperty() позволяет проверить, есть ли в экземпляре класса указанный параметр:
samePropertyValuesAs #
Метод samePropertyValuesAs() позволяет сравнить два экземпляра одного или разных классов.
Однако стоит отметить, что этот метод корректно работает только с простыми POJO без вложенных классов.
Увидел(а) ошибку в тексте? Нет нужной информации или она не полная?
Скорей же исправь данный недочет и облегчи жизнь себе и своей команде!
Обязательно ознакомься с тем как заполнить bugаж знаний и после создавай МР в проекте bugаж знаний на своего QA Team Lead.
Является ли класс POJO обьектом?
Не совсем пойму в чем так удобен POJO объект и как понять, что он POJO.
По определению это объект, который ничего не расширяет, ничего не имплементирует и не имеет конструктора, все переменные приватные + геттеры и сеттеры. Просто такой себе простой объект.
Значит, если я правильно понимаю, что если допустим выкинуть с этого класса конструктор то он как бы уже POJO?
И я не нашел, можно ли использовать логические методы в таких классах? Допустим метод какого нибудь вычисления.
Ну и если кто нибудь приведет примеры, где такие объекты использовать лучше всего (так как не сомнительное преимущество выкинуть конструктор и поставить сеттеры), то будет совсем понятно))
1 ответ 1
Как правило, такие классы не наследуют от других классов (наверное, можно сделать исключение для классов POJO из того же пакета), не реализуют интерфейсов (иногда делается исключение для маркерных интерфейсов из стандартной библиотеки), не используют аннотаций в определениях и не зависят от сторонних библиотек. Т.е. у POJO могут быть и методы с бизнес-логикой, и произвольного вида конструкторы.
Если делать исключение для Serializable, то к POJO могут быть отнесены JavaBeans. Если разрешить аннотации, не меняющие семантику класса (т.е. без которых назначение объекта и логика его работы не изменятся), то к POJO могут быть отнесены сущности JPA и объекты DTO, сериализуемые в XML или JSON, правила для которых заданы в аннотациях.