1cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick/*
2cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick * Copyright (C) 2010 The Android Open Source Project
3cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick *
4cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick * Licensed under the Apache License, Version 2.0 (the "License");
5cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick * you may not use this file except in compliance with the License.
6cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick * You may obtain a copy of the License at
7cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick *
8cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick *      http://www.apache.org/licenses/LICENSE-2.0
9cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick *
10cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick * Unless required by applicable law or agreed to in writing, software
11cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick * distributed under the License is distributed on an "AS IS" BASIS,
12cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick * See the License for the specific language governing permissions and
14cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick * limitations under the License.
15cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick */
16cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick
17cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrickpackage android.util;
18cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick
19cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick/**
20cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick * Singleton helper class for lazily initialization.
21cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick *
22cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick * Modeled after frameworks/base/include/utils/Singleton.h
23cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick *
24cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick * @hide
25cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick */
26cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrickpublic abstract class Singleton<T> {
27cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick    private T mInstance;
28cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick
29cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick    protected abstract T create();
30cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick
31cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick    public final T get() {
32cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick        synchronized (this) {
33cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick            if (mInstance == null) {
34cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick                mInstance = create();
35cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick            }
36cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick            return mInstance;
37cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick        }
38cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick    }
39cdcb73ef781b8f7d37d9f758409a0c7671517b37Brad Fitzpatrick}
40