Skip to content

Commit b1a0bb4

Browse files
committed
Polishing.
Refine Javadoc. Add unit tests. See spring-projects#2929 Original pull request: spring-projects#2930
1 parent 107f268 commit b1a0bb4

File tree

2 files changed

+88
-85
lines changed

2 files changed

+88
-85
lines changed

src/main/java/org/springframework/data/util/Lazy.java

+86-84
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@
2525

2626
/**
2727
* Simple value type to delay the creation of an object using a {@link Supplier} returning the produced object for
28-
* subsequent lookups. Note, that no concurrency control is applied during the lookup of {@link #get()}, which means in
29-
* concurrent access scenarios, the provided {@link Supplier} can be called multiple times.
28+
* subsequent lookups.
29+
* <p>
30+
* Note, that no concurrency control is applied during the lookup of {@link #get()}, which means in concurrent access
31+
* scenarios, the provided {@link Supplier} can be called multiple times.
3032
*
3133
* @author Oliver Gierke
3234
* @author Mark Paluch
@@ -45,17 +47,12 @@ public class Lazy<T> implements Supplier<T> {
4547
private @Nullable T value;
4648
private volatile boolean resolved;
4749

48-
/**
49-
* Creates a new {@link Lazy} instance for the given supplier.
50-
*
51-
* @param supplier
52-
*/
5350
private Lazy(Supplier<? extends T> supplier) {
5451
this(supplier, null, false);
5552
}
5653

5754
/**
58-
* Creates a new {@link Lazy} for the given {@link Supplier}, value and whether it has been resolved or not.
55+
* Creates a new {@code Lazy} for the given {@link Supplier}, value and whether it has been resolved or not.
5956
*
6057
* @param supplier must not be {@literal null}.
6158
* @param value can be {@literal null}.
@@ -69,22 +66,22 @@ private Lazy(Supplier<? extends T> supplier, @Nullable T value, boolean resolved
6966
}
7067

7168
/**
72-
* Creates a new {@link Lazy} to produce an object lazily.
69+
* Creates a new {@code Lazy} to produce an object lazily.
7370
*
7471
* @param <T> the type of which to produce an object of eventually.
7572
* @param supplier the {@link Supplier} to create the object lazily.
76-
* @return
73+
* @return a {@code Lazy} wrapping the given {@link Supplier}.
7774
*/
7875
public static <T> Lazy<T> of(Supplier<? extends T> supplier) {
7976
return new Lazy<>(supplier);
8077
}
8178

8279
/**
83-
* Creates a new {@link Lazy} to return the given value.
80+
* Creates a new {@code Lazy} to return the given value.
8481
*
8582
* @param <T> the type of the value to return eventually.
8683
* @param value the value to return.
87-
* @return
84+
* @return a {@code Lazy} wrapping {@code value}.
8885
*/
8986
public static <T> Lazy<T> of(T value) {
9087

@@ -94,9 +91,9 @@ public static <T> Lazy<T> of(T value) {
9491
}
9592

9693
/**
97-
* Creates a pre-resolved empty {@link Lazy}.
94+
* Creates a pre-resolved empty {@code Lazy}.
9895
*
99-
* @return
96+
* @return an empty {@code Lazy}.
10097
* @since 2.1
10198
*/
10299
@SuppressWarnings("unchecked")
@@ -105,11 +102,12 @@ public static <T> Lazy<T> empty() {
105102
}
106103

107104
/**
108-
* Returns the value created by the configured {@link Supplier}. Will return the calculated instance for subsequent
109-
* lookups.
105+
* Returns the value created by the configured {@link Supplier}. Will return the same instance for subsequent lookups.
110106
*
111-
* @return
107+
* @return the value created by the configured {@link Supplier}. Will return the same instance for subsequent lookups.
108+
* @throws IllegalStateException if the resolved value is {@literal null}.
112109
*/
110+
@Override
113111
public T get() {
114112

115113
T value = getNullable();
@@ -121,63 +119,84 @@ public T get() {
121119
return value;
122120
}
123121

122+
/**
123+
* Returns the value of the lazy evaluation.
124+
*
125+
* @return the value of the lazy evaluation, can be {@literal null}.
126+
* @since 2.2
127+
*/
128+
@Nullable
129+
public T getNullable() {
130+
131+
if (resolved) {
132+
return value;
133+
}
134+
135+
this.value = supplier.get();
136+
this.resolved = true;
137+
138+
return value;
139+
}
140+
124141
/**
125142
* Returns the {@link Optional} value created by the configured {@link Supplier}, allowing the absence of values in
126143
* contrast to {@link #get()}. Will return the calculated instance for subsequent lookups.
127144
*
128-
* @return
145+
* @return an {@link Optional} value created by the configured {@link Supplier} or an empty {@link Optional} if the
146+
* resolved value is {@literal null}.
129147
*/
130148
public Optional<T> getOptional() {
131149
return Optional.ofNullable(getNullable());
132150
}
133151

134152
/**
135-
* Returns a new Lazy that will consume the given supplier in case the current one does not yield in a result.
153+
* Returns a new {@code Lazy} that will return the given value in case the current one does not yield in a result.
136154
*
137-
* @param supplier must not be {@literal null}.
138-
* @return
155+
* @param other must not be {@literal null}.
156+
* @return a new {@code Lazy} that will yield its value if present, otherwise {@code other}.
139157
*/
140-
public Lazy<T> or(Supplier<? extends T> supplier) {
158+
public Lazy<T> or(T other) {
141159

142-
Assert.notNull(supplier, "Supplier must not be null");
160+
Assert.notNull(other, "Other value must not be null");
143161

144-
return Lazy.of(() -> orElseGet(supplier));
162+
return Lazy.of(() -> orElse(other));
145163
}
146164

147165
/**
148-
* Returns a new Lazy that will return the given value in case the current one does not yield in a result.
166+
* Returns a new {@code Lazy} that will consume the given supplier in case the current one does not yield in a result.
149167
*
150-
* @param value must not be {@literal null}.
151-
* @return
168+
* @param supplier the supplying function that produces a value to be returned, must not be {@literal null}.
169+
* @return a new {@code Lazy} that will yield its value if present, otherwise the result produced by the supplying
170+
* function.
152171
*/
153-
public Lazy<T> or(T value) {
172+
public Lazy<T> or(Supplier<? extends T> supplier) {
154173

155-
Assert.notNull(value, "Value must not be null");
174+
Assert.notNull(supplier, "Supplier must not be null");
156175

157-
return Lazy.of(() -> orElse(value));
176+
return Lazy.of(() -> orElseGet(supplier));
158177
}
159178

160179
/**
161180
* Returns the value of the lazy computation or the given default value in case the computation yields
162181
* {@literal null}.
163182
*
164-
* @param value
165-
* @return
183+
* @param other the value to be returned, if no value is present. May be {@literal null}.
184+
* @return the value, if present, otherwise {@code other}.
166185
*/
167186
@Nullable
168-
public T orElse(@Nullable T value) {
187+
public T orElse(@Nullable T other) {
169188

170189
T nullable = getNullable();
171190

172-
return nullable == null ? value : nullable;
191+
return nullable == null ? other : nullable;
173192
}
174193

175194
/**
176195
* Returns the value of the lazy computation or the value produced by the given {@link Supplier} in case the original
177196
* value is {@literal null}.
178197
*
179-
* @param supplier must not be {@literal null}.
180-
* @return
198+
* @param supplier the supplying function that produces a value to be returned, must not be {@literal null}.
199+
* @return the value, if present, otherwise the result produced by the supplying function.
181200
*/
182201
@Nullable
183202
public T orElseGet(Supplier<? extends T> supplier) {
@@ -190,10 +209,11 @@ public T orElseGet(Supplier<? extends T> supplier) {
190209
}
191210

192211
/**
193-
* Creates a new {@link Lazy} with the given {@link Function} lazily applied to the current one.
212+
* Creates a new {@code Lazy} with the given {@link Function} lazily applied to the current one.
194213
*
195214
* @param function must not be {@literal null}.
196-
* @return
215+
* @return an {@code Lazy} describing the result of applying a mapping function to the value of this {@code Lazy} or
216+
* throwing {@link IllegalStateException} if the {@code Lazy} is empty.
197217
*/
198218
public <S> Lazy<S> map(Function<? super T, ? extends S> function) {
199219

@@ -203,10 +223,11 @@ public <S> Lazy<S> map(Function<? super T, ? extends S> function) {
203223
}
204224

205225
/**
206-
* Creates a new {@link Lazy} with the given {@link Function} lazily applied to the current one.
226+
* Creates a new {@code Lazy} with the given {@link Function} lazily applied to the current one.
207227
*
208228
* @param function must not be {@literal null}.
209-
* @return
229+
* @return the result of applying an {@code Lazy}-bearing mapping function to the value of this {@code Lazy} or a
230+
* {@code Lazy} throwing {@link IllegalStateException} if the {@code Lazy} is empty.
210231
*/
211232
public <S> Lazy<S> flatMap(Function<? super T, Lazy<? extends S>> function) {
212233

@@ -215,50 +236,6 @@ public <S> Lazy<S> flatMap(Function<? super T, Lazy<? extends S>> function) {
215236
return Lazy.of(() -> function.apply(get()).get());
216237
}
217238

218-
/**
219-
* Returns the {@link String} representation of the already resolved value or the one provided through the given
220-
* {@link Supplier} if the value has not been resolved yet.
221-
*
222-
* @param fallback must not be {@literal null}.
223-
* @return will never be {@literal null}.
224-
* @since 3.0.1
225-
*/
226-
public String toString(Supplier<String> fallback) {
227-
228-
Assert.notNull(fallback, "Fallback must not be null!");
229-
230-
return resolved ? toString() : fallback.get();
231-
}
232-
233-
/**
234-
* Returns the value of the lazy evaluation.
235-
*
236-
* @return
237-
* @since 2.2
238-
*/
239-
@Nullable
240-
public T getNullable() {
241-
242-
if (resolved) {
243-
return value;
244-
}
245-
246-
this.value = supplier.get();
247-
this.resolved = true;
248-
249-
return value;
250-
}
251-
252-
@Override
253-
public String toString() {
254-
255-
if (!resolved) {
256-
return UNRESOLVED;
257-
}
258-
259-
return value == null ? "null" : value.toString();
260-
}
261-
262239
@Override
263240
public boolean equals(@Nullable Object o) {
264241

@@ -291,4 +268,29 @@ public int hashCode() {
291268

292269
return result;
293270
}
271+
272+
@Override
273+
public String toString() {
274+
275+
if (!resolved) {
276+
return UNRESOLVED;
277+
}
278+
279+
return value == null ? "null" : value.toString();
280+
}
281+
282+
/**
283+
* Returns the {@link String} representation of the already resolved value or the one provided through the given
284+
* {@link Supplier} if the value has not been resolved yet.
285+
*
286+
* @param fallback must not be {@literal null}.
287+
* @return will never be {@literal null}.
288+
* @since 3.0.1
289+
*/
290+
public String toString(Supplier<String> fallback) {
291+
292+
Assert.notNull(fallback, "Fallback must not be null!");
293+
294+
return resolved ? toString() : fallback.get();
295+
}
294296
}

src/test/java/org/springframework/data/util/LazyUnitTests.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ void returnsLastValueInChain() {
7070
@Test
7171
void returnsCachedInstanceOnMultipleAccesses() {
7272

73-
var lazy = Lazy.of(() -> new Object());
73+
var lazy = Lazy.of(Object::new);
7474

7575
assertThat(lazy.get()).isSameAs(lazy.get());
7676
}
@@ -113,6 +113,7 @@ void returnsElseValue() {
113113
var empty = Lazy.of(() -> null);
114114

115115
assertThat(empty.orElse(reference)).isEqualTo(reference);
116+
assertThat(empty.orElseGet(() -> reference)).isEqualTo(reference);
116117
assertThat(empty.or(reference).get()).isEqualTo(reference);
117118
assertThat(empty.or(() -> reference).get()).isEqualTo(reference);
118119
}

0 commit comments

Comments
 (0)