From 71cf7458520b5844c843a154d28f8554b53a3f58 Mon Sep 17 00:00:00 2001 From: Zac Sweers Date: Thu, 12 Sep 2019 14:14:49 -0400 Subject: [PATCH] Don't re-wrap nullsafe/nonnull adapters if they are already one (#909) * Don't re-wrap nullsafe/nonnull adapters if they are already one nullSafe() is often called defensively, which can lead to a lot of layers of wrapping and checking. This avoids that overhead where possible. * Add tests --- .../src/main/java/com/squareup/moshi/JsonAdapter.java | 6 ++++++ .../test/java/com/squareup/moshi/JsonAdapterTest.java | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/moshi/src/main/java/com/squareup/moshi/JsonAdapter.java b/moshi/src/main/java/com/squareup/moshi/JsonAdapter.java index 9143b16..a35fc96 100644 --- a/moshi/src/main/java/com/squareup/moshi/JsonAdapter.java +++ b/moshi/src/main/java/com/squareup/moshi/JsonAdapter.java @@ -130,6 +130,9 @@ public abstract class JsonAdapter { * nulls. */ @CheckReturnValue public final JsonAdapter nullSafe() { + if (this instanceof NullSafeJsonAdapter) { + return this; + } return new NullSafeJsonAdapter<>(this); } @@ -141,6 +144,9 @@ public abstract class JsonAdapter { * handled elsewhere. This should only be used to fail on explicit nulls. */ @CheckReturnValue public final JsonAdapter nonNull() { + if (this instanceof NonNullJsonAdapter) { + return this; + } return new NonNullJsonAdapter<>(this); } diff --git a/moshi/src/test/java/com/squareup/moshi/JsonAdapterTest.java b/moshi/src/test/java/com/squareup/moshi/JsonAdapterTest.java index 590e283..2fbfa6a 100644 --- a/moshi/src/test/java/com/squareup/moshi/JsonAdapterTest.java +++ b/moshi/src/test/java/com/squareup/moshi/JsonAdapterTest.java @@ -285,4 +285,14 @@ public final class JsonAdapterTest { }.lenient().serializeNulls(); assertThat(adapter.fromJson("true true")).isEqualTo(true); } + + @Test public void nullSafeDoesntDuplicate() { + JsonAdapter adapter = new Moshi.Builder().build().adapter(Boolean.class).nullSafe(); + assertThat(adapter.nullSafe()).isSameAs(adapter); + } + + @Test public void nonNullDoesntDuplicate() { + JsonAdapter adapter = new Moshi.Builder().build().adapter(Boolean.class).nonNull(); + assertThat(adapter.nonNull()).isSameAs(adapter); + } }