From e4818cdcfc6d7e1f20885c2781b04b3ab412491c Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Mon, 21 Apr 2025 22:30:47 -0400 Subject: [PATCH 1/2] return default instance on unchanged builder I can't see a reason to return separate instances --- .../main/java/io/avaje/jsonb/core/DJsonb.java | 60 ++++++++++++++----- .../java/io/avaje/jsonb/core/TestBuilder.java | 23 +++++++ 2 files changed, 69 insertions(+), 14 deletions(-) create mode 100644 jsonb/src/test/java/io/avaje/jsonb/core/TestBuilder.java diff --git a/jsonb/src/main/java/io/avaje/jsonb/core/DJsonb.java b/jsonb/src/main/java/io/avaje/jsonb/core/DJsonb.java index 3a03536b..85745066 100644 --- a/jsonb/src/main/java/io/avaje/jsonb/core/DJsonb.java +++ b/jsonb/src/main/java/io/avaje/jsonb/core/DJsonb.java @@ -1,25 +1,38 @@ package io.avaje.jsonb.core; -import io.avaje.json.JsonAdapter; -import io.avaje.json.JsonReader; -import io.avaje.json.JsonWriter; -import io.avaje.json.PropertyNames; -import io.avaje.json.stream.*; -import io.avaje.jsonb.*; -import io.avaje.jsonb.AdapterFactory; -import io.avaje.jsonb.spi.*; +import static io.avaje.json.stream.BufferRecycleStrategy.HYBRID_POOL; +import static io.avaje.jsonb.core.Util.canonicalize; +import static io.avaje.jsonb.core.Util.canonicalizeClass; +import static io.avaje.jsonb.core.Util.removeSubtypeWildcard; +import static java.util.Objects.requireNonNull; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; import java.io.Writer; import java.lang.reflect.Type; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; -import static io.avaje.jsonb.core.Util.*; -import static java.util.Objects.requireNonNull; +import io.avaje.json.JsonAdapter; +import io.avaje.json.JsonReader; +import io.avaje.json.JsonWriter; +import io.avaje.json.PropertyNames; +import io.avaje.json.stream.BufferRecycleStrategy; +import io.avaje.json.stream.BufferedJsonWriter; +import io.avaje.json.stream.BytesJsonWriter; +import io.avaje.json.stream.JsonOutput; +import io.avaje.json.stream.JsonStream; +import io.avaje.jsonb.AdapterFactory; +import io.avaje.jsonb.JsonType; +import io.avaje.jsonb.JsonView; +import io.avaje.jsonb.Jsonb; +import io.avaje.jsonb.spi.GeneratedComponent; +import io.avaje.jsonb.spi.JsonbComponent; /** * Default implementation of Jsonb. @@ -245,6 +258,8 @@ public int hashCode() { */ static final class DBuilder implements Jsonb.Builder { + private static final Jsonb DEFAULT = Jsonb.builder().build(); + private final List factories = new ArrayList<>(); private boolean failOnUnknown; private boolean failOnNullPrimitives; @@ -253,7 +268,7 @@ static final class DBuilder implements Jsonb.Builder { private boolean serializeNulls; private boolean serializeEmpty = true; private JsonStream adapter; - private BufferRecycleStrategy strategy = BufferRecycleStrategy.HYBRID_POOL; + private BufferRecycleStrategy strategy = HYBRID_POOL; @Override public Builder serializeNulls(boolean serializeNulls) { @@ -341,12 +356,29 @@ private void registerComponents() { } @Override - public DJsonb build() { + public Jsonb build() { + if (!hasCustomizations()) { + return DEFAULT; + } registerComponents(); return new DJsonb(adapter, factories, serializeNulls, serializeEmpty, failOnUnknown, failOnNullPrimitives, mathTypesAsString, calendarAsString, strategy); } - static AdapterFactory newAdapterFactory(Type type, JsonAdapter jsonAdapter) { + private boolean hasCustomizations() { + + return DEFAULT == null + || adapter != null + || !factories.isEmpty() + || failOnUnknown + || failOnNullPrimitives + || mathTypesAsString + || calendarAsString + || serializeNulls + || !serializeEmpty + || HYBRID_POOL != strategy; + } + + static AdapterFactory newAdapterFactory(Type type, JsonAdapter jsonAdapter) { requireNonNull(type); requireNonNull(jsonAdapter); return (targetType, jsonb) -> simpleMatch(type, targetType) ? jsonAdapter : null; diff --git a/jsonb/src/test/java/io/avaje/jsonb/core/TestBuilder.java b/jsonb/src/test/java/io/avaje/jsonb/core/TestBuilder.java new file mode 100644 index 00000000..15a6878d --- /dev/null +++ b/jsonb/src/test/java/io/avaje/jsonb/core/TestBuilder.java @@ -0,0 +1,23 @@ +package io.avaje.jsonb.core; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +import io.avaje.jsonb.Jsonb; + +class TestBuilder { + + @Test + void defaultBuilderReturnSameInstance() { + + assertThat(Jsonb.builder().build()).isSameAs(Jsonb.builder().build()); + } + + @Test + void changedBuilderNotSame() { + + assertThat(Jsonb.builder().mathTypesAsString(true).build()) + .isNotSameAs(Jsonb.builder().build()); + } +} From e09d3d7414bd946999fbc50b6f44416675193e69 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Wed, 23 Apr 2025 07:41:48 +1200 Subject: [PATCH 2/2] format only --- .../main/java/io/avaje/jsonb/core/DJsonb.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/jsonb/src/main/java/io/avaje/jsonb/core/DJsonb.java b/jsonb/src/main/java/io/avaje/jsonb/core/DJsonb.java index 85745066..c41b0d45 100644 --- a/jsonb/src/main/java/io/avaje/jsonb/core/DJsonb.java +++ b/jsonb/src/main/java/io/avaje/jsonb/core/DJsonb.java @@ -365,17 +365,16 @@ public Jsonb build() { } private boolean hasCustomizations() { - return DEFAULT == null - || adapter != null - || !factories.isEmpty() - || failOnUnknown - || failOnNullPrimitives - || mathTypesAsString - || calendarAsString - || serializeNulls - || !serializeEmpty - || HYBRID_POOL != strategy; + || adapter != null + || !factories.isEmpty() + || failOnUnknown + || failOnNullPrimitives + || mathTypesAsString + || calendarAsString + || serializeNulls + || !serializeEmpty + || HYBRID_POOL != strategy; } static AdapterFactory newAdapterFactory(Type type, JsonAdapter jsonAdapter) {