java单例的另一种写法
阅读android源码时发现ActivityManager有一个单例的写法如下:
/**
* @hide
*/
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
private static final Singleton<IActivityManager> IActivityManagerSingleton =
new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
final IActivityManager am = IActivityManager.Stub.asInterface(b);
return am;
}
};
Singleton这个类是源码android.util包里面打上@hide
代码路径:/frameworks/base/core/java/android/util/Singleton.java
package android.util;
/**
* Singleton helper class for lazily initialization.
*
* Modeled after frameworks/base/include/utils/Singleton.h
*
* @hide
*/
public abstract class Singleton<T> {
private T mInstance;
protected abstract T create();
public final T get() {
synchronized (this) {
if (mInstance == null) {
mInstance = create();
}
return mInstance;
}
}
}
下面我用kotlin来实现如上效果
abstract class SingletonV2<T> {
private val mInstance: T by lazy(LazyThreadSafetyMode.SYNCHRONIZED)
{
create()
}
protected abstract fun create(): T
fun get(): T {
return mInstance
}
}
如何使用?
private static final SingletonV2<PKModel> singletonV2 = new SingletonV2<PKModel>() {
@Override
protected PKModel create() {
return new PKModel();
}
};
public static PKModel getInstance() {
return singletonV2.get();
}
这种单例写法的好处就是使用了线程安全,并且是双延迟