1 /*
2 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License").
5 * You may not use this file except in compliance with the License.
6 * A copy of the License is located at
7 *
8 * http://aws.amazon.com/apache2.0
9 *
10 * or in the "license" file accompanying this file. This file is distributed
11 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12 * express or implied. See the License for the specific language governing
13 * permissions and limitations under the License.
14 */
15
16 package software.amazon.awssdk.utils;
17
18 import java.util.function.Supplier;
19 import software.amazon.awssdk.annotations.SdkPublicApi;
20
21 /**
22 * A class that lazily constructs a value the first time {@link #getValue()} is invoked.
23 */
24 @SdkPublicApi
25 public class Lazy<T> {
26 private final Supplier<T> initializer;
27
28 private volatile T value;
29
30 public Lazy(Supplier<T> initializer) {
31 this.initializer = initializer;
32 }
33
34 public T getValue() {
35 T result = value;
36 if (result == null) {
37 synchronized (this) {
38 result = value;
39 if (result == null) {
40 result = initializer.get();
41 value = result;
42 }
43 }
44 }
45
46 return result;
47 }
48
49 @Override
50 public String toString() {
51 T value = this.value;
52 return ToString.builder("Lazy")
53 .add("value", value == null ? "Uninitialized" : value)
54 .build();
55 }
56 }
57