/**
* DESC : kt中的单例模式
*/
const val KtBaseSingleTonTest01_TAG = "KtBaseSingleTonTest01"
/**
* Java中的懒汉式 (双重校验)
*
* public class SingleTon {
private static SingleTon instance;
private SingleTon(){}
public static SingleTon getInstance() {
if (instance == null) {
synchronized(SingleTon.class) {
if (instance == null) {
instance = new SingleTon()
}
}
}
return instance;
}
}
*/
/**
* kotlin懒汉式单例模式
*/
class SingleTonKt1 {
companion object {
private var instance : SingleTonKt1? = null
get() {
if (field == null) {
field = SingleTonKt1()
}
return field
}
@Synchronized
// fun getKtInstance1() = instance
fun getKtInstance1() = instance!!
}
fun getInfo() {
Log.d(KtBaseSingleTonTest01_TAG, "getInfo==>")
}
}
/**
* kotlin懒汉式单例模式双重校验安全,类似java的双重校验
*/
class SingleTonKt2 {
companion object {
val instance : SingleTonKt2 by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
SingleTonKt2()
}
}
fun getInfo() {
Log.d(KtBaseSingleTonTest01_TAG, "getInfo==>")
}
}
class KtBaseSingleTonTest01 {
fun testSingletonKt01() {
Log.d(KtBaseSingleTonTest01_TAG, "testSingletonKt01==>")
/**
* 如果getKtInstance1方法直接返回instance,instance可能为空,在调用的时候需要加非空判断
* fun getKtInstance1() = instance
* 调用如下:
* SingleTonKt1.getKtInstance1()?.getInfo()
*/
SingleTonKt1.getKtInstance1()?.getInfo()
/**
* 如果getKtInstance1方法返回instance!!,断言不为空,则在调用的时候无需再加非空判断
* fun getKtInstance1() = instance!!
* 调用如下:
* SingleTonKt1.getKtInstance1().getInfo()
*/
SingleTonKt1.getKtInstance1().getInfo()
}
fun testSingletonKt02() {
SingleTonKt2.instance.getInfo()
}
}
网友评论