Jackson и неизменяемые объекты

Неизменяемые объекты в Java — это объекты, которые не имеют внутреннего состояния, или объекты, состояние которых не меняется после создания.

Пример неизменяемого класса:

У неизменяемого класса нет методов установки значений, вместо этого значения x  и  y  устанавливаются в конструкторе. Преимущество подобных классов в том, что их можно без опасений применять в многопоточном приложении без всякой синхронизации. Неизменяемые объекты используются в качестве ключей java.util.Map.

В самом простом случае для поддержки неизменяемых объектов используется аннотация @JsonCreator:

С этой аннотацией Jackson будет использовать конструктор для передачи параметров x  и y, в таком случае аннотации @JsonProperty  обязательны.

Можно также использовать методы-фабрики, для этого их нужно пометить аннотацией @JsonFactory:

Можно также смешивать использование конструктора с методами установки значений и полями, а также использование фабрики с методами установки значений и полями.

Могут быть неизменяемые классы по поведению, но имеющие не final  поля. У таких классов нет публичных методов, изменяющих значения полей, но сами поле не final . В таком случае можно просто аннотировать эти поля @JsonProperty:

Ещё один способ добиться неизменямости — это разделить интерфейс и объект на несколько частей: публичную часть только для чтения и изменяемую часть. Пусть мы имеем интерфейс Point  и реализацию PointImpl. Проблема возникает с зависимостями. Давайте рассмотрим класс:

Каким образом Jackson сможет узнать, что нужно использовать реализацию PointImpl  для поля center? Проще всего использовать аннотацию @JsonDeserialize, с помощью которой можно указать конкретный тип (можно использовать также для коллекций):

Есть ещё одна интересная штука — материализатор:

и затем Jackson будет создавать реализации для любого класса или интерфейса, где все абстрактные методы являются методами установки или получения значений, и использовать его при десериализации.

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

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