Как в документации сказано, что это действительно дешевая операция, и вы можете сделать это «на основе вызова». Посмотрим, что у нас за каждым методом.
ObjectMapper.writer
- создает новый ObjectWriter
, используя SerializationConfig
из ObjectMapper
.
ObjectWriter.with
- создает новый ObjectWriter
на основе экземпляра caller
плюс новую функцию, которая должна быть включена. Если данная функция уже включена, возвращается тот же экземпляр. Если функция изменяет конфигурацию - создается и возвращается новый ObjectWriter
.
Давайте посмотрим пример приложения, которое показывает данный сценарий:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.util.Collections;
import java.util.Map;
public class JsonApp {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
ObjectWriter writer0 = mapper.writer();
ObjectWriter writer1 = writer0.with(SerializationFeature.INDENT_OUTPUT);
ObjectWriter writer2 = writer1.with(SerializationFeature.INDENT_OUTPUT);
ObjectWriter writer3 = writer2.with(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);
Map<String, Long> map = Collections.singletonMap("key", 123L);
System.out.println(writer0 + " = " + writer0.writeValueAsString(map));
System.out.println(writer1 + " = " + writer1.writeValueAsString(map));
System.out.println(writer2 + " = " + writer2.writeValueAsString(map));
System.out.println(writer3 + " = " + writer3.writeValueAsString(map));
ObjectMapper mapper1 = new ObjectMapper();
mapper1.enable(SerializationFeature.INDENT_OUTPUT);
mapper1.enable(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);
ObjectWriter writer4 = mapper1.writer();
System.out.println(writer4 + " = " + writer4.writeValueAsString(map));
}
}
Над отпечатками приложений:
com.fasterxml.jackson.databind.ObjectWriter@2ed94a8b = {"key":123}
com.fasterxml.jackson.databind.ObjectWriter@2a5ca609 = {
"key" : 123
}
com.fasterxml.jackson.databind.ObjectWriter@2a5ca609 = {
"key" : 123
}
com.fasterxml.jackson.databind.ObjectWriter@20e2cbe0 = {
"key" : "123"
}
com.fasterxml.jackson.databind.ObjectWriter@68be2bc2 = {
"key" : "123"
}
Обратите внимание, что второй (writer1
) и третий (writer2
) экземпляры (com.fasterxml.jackson.databind.ObjectWriter@2a5ca609
) одинаковы. Они также генерируют такую же JSON
полезную нагрузку.
Итак, используя первый экземпляр ObjectMapper
, мы создали и настроили ObjectWriter
. Но в основном используется только последний. Все промежуточное уже ушло и ждите сбора к GC
. Там нет смысла делать это. Лучше создать экземпляр ObjectMapper
, настроить его и создать уже настроенный ObjectWriter
, вызвав метод writer()
. Вы можете создать Factory
-подобный класс для сконфигурированных экземпляров ObjectMapper
и использовать эти экземпляры для генерации ObjectWriter
-s.