Взято из Википедии:
POJO - это аббревиатура от Plain Old Java Object. Имя используется, чтобы подчеркнуть, что данный объект является обычным Java-объектом, а не специальным объектом.
POJO обычно прост, поэтому не зависит от других библиотек, интерфейсов или аннотаций. Это увеличивает вероятность того, что его можно будет повторно использовать в нескольких типах проектов (веб, настольный компьютер, консоль и т. Д.).
Как кто-то уже указывал в комментариях, ваш объект технически уже является POJO, однако вы специально спрашивали о геттерах и сеттерах, которые больше похожи на JavaBeans.
Есть ряд причин, по которым я могу использовать геттеры и сеттеры:
- Возможно, вам понадобится получить только некоторые значения (например, значения только для чтения). С помощью полей клиенты могут как получать, так и устанавливать значения напрямую. Поля можно сделать доступными только для чтения, если они помечены как окончательные, хотя это не всегда гарантирует их неизменность (см. Пункт 9).
- Методы получения и установки позволяют изменять базовый тип данных без нарушения общедоступного интерфейса вашего класса, что делает его (и ваше приложение) более надежным и устойчивым к изменениям.
- Возможно, вы захотите вызвать какой-либо другой код, например, запросить уведомление, когда значение получено или изменено. Это невозможно с вашим текущим классом.
- Вы раскрываете реализацию своего класса, что в некоторых случаях может представлять угрозу безопасности.
- Java-бины разработаны на основе POJO, что означает, что если ваш класс не реализован как один, он не может использоваться некоторыми инструментами и библиотеками, которые ожидают, что ваш класс будет придерживаться этих устоявшихся принципов.
- Вы можете отображать значения, которые не поддерживаются полем I.E. вычисляемые значения, такие как
getFullName()
, которые являются конкатенацией getFirstName()
и getLastName()
, которые поддерживаются полями.
- Вы можете добавить проверку к своим методам установки, чтобы убедиться, что передаваемые значения верны. Это гарантирует, что ваш класс всегда находится в допустимом состоянии.
- Вы можете установить точку останова в ваших геттерах и установщиках, чтобы вы могли отлаживать свой код при получении или изменении значений.
- Если поле является объектом (т.е. не примитивным типом), тогда внутреннее состояние вашего класса может быть изменено другими объектами, что может привести к ошибкам или угрозам безопасности. Вы можете защитить от этого сценария в геттере вашего POJO, вернув копию объекта, чтобы клиенты могли работать с данными, не влияя на состояние вашего объекта. Обратите внимание, что наличие последнего поля не всегда защищает вас от такого рода атак, поскольку клиенты все еще могут вносить изменения в объект, на который ссылаются (при условии, что этот объект сам изменяемый), вы просто не может указывать поле на другую ссылку после того, как она была установлена.
Да, доступ или установка значений с помощью вызовов методов может быть медленнее, чем прямой доступ к полю, но разница едва заметна и, конечно же, не будет узким местом в вашей программе.
Хотя преимущества очевидны, это не означает, что геттеры и сеттеры - серебряная пуля. При разработке надежных масштабируемых классов в реальном мире необходимо учитывать ряд ошибок.
В этом ответе на очень похожий вопрос подробно рассматриваются некоторые соображения при разработке класса, имеющего геттеры и сеттеры. Хотя предложения могут быть более уместными в зависимости от типа создаваемого вами класса, Э. класс, который составляет часть API в большой системе, а не простой объект передачи данных.
Также обратите внимание, что могут быть определенные сценарии, в которых класс с прямым полем может быть выгодным, например, когда скорость важна или память ограничена, хотя это следует учитывать только после профилирования вашего кода и обнаружения, что на самом деле это узкое место сильный>.
Также будьте осторожны, чтобы вы не просто оборачивали все свои поля в геттеры и сеттеры, так как это действительно упускает из виду точку инкапсуляции.
Этот ответ дает хорошее резюме причин выбора POJO вместо объекта стиля JavaBean с геттерами и сеттерами.
person
Benjamin Gale
schedule
05.01.2013
final
, чтобы предотвратить установку недопустимых значений. - person jlordo   schedule 05.01.2013Key
действителен. - person jackalope   schedule 05.01.2013