前言
前三篇主要講了下Kotlin語言的基本用法,以后在寫關(guān)于Kotlin文章的時候可以java和Kotlin一起寫,對比起來看會比較好。這篇文章主要講一下Kotlin中單例模式的用法,主要以代碼為主。
1.餓漢式
java的寫法比較簡單
public class SingletonJ {
public static SingletonJ singletonJ = new SingletonJ();
public static SingletonJ getInstance() {
return singletonJ;
}
}
Kotlin自帶單例,如下創(chuàng)建就行

1563717483(1).jpg
object SingletonK {
}
查看Kotlin字節(jié)碼發(fā)現(xiàn)其實(shí)原理都是一樣的

1563717622(1).jpg
2.懶漢式
public class SingletonJ {
public static SingletonJ singletonJ;
public static SingletonJ getInstance() {
if (singletonJ == null)
singletonJ = new SingletonJ();
return singletonJ;
}
}
Kotlin的寫法比較多,可以直接從java翻譯,還有一種寫法就有點(diǎn)復(fù)雜了,私有構(gòu)造函數(shù),我們也用到了他的get()方法。注意:companion object 修飾為伴生對象,伴生對象在類中只能存在一個,類似于java中的靜態(tài)方法 Java 中使用類訪問靜態(tài)成員,靜態(tài)方法。
class SingletonKK private constructor(){
companion object {
private var singletonKK : SingletonKK? = null
get() {
if (field == null)
field = SingletonKK()
return field;
}
fun get() : SingletonKK? {
return singletonKK
}
}
}
創(chuàng)建的時候直接可以
var instance:SingletonKK = SingletonKK.get()!!
當(dāng)然還有一種簡便的實(shí)現(xiàn)方式,LazyThreadSafetyMode.NONE線程非安全
class SingletonLazy private constructor(){
companion object {
val Instance by lazy(mode = LazyThreadSafetyMode.NONE) {
SingletonLazy()
}
}
}
3.線程安全的懶漢式
java中實(shí)現(xiàn)線程安全用到了synchronized,可以是方法鎖,也可以用對象鎖
public class SingletonJ {
public static SingletonJ singletonJ;
public static synchronized SingletonJ getInstance() {
if (singletonJ == null)
singletonJ = new SingletonJ();
return singletonJ;
}
}
Kotlin直接聲明@Synchronized為同步就行
class SingletonKK private constructor(){
companion object {
private var singletonKK : SingletonKK? = null
get() {
if (field == null)
field = SingletonKK()
return field;
}
@Synchronized
fun get() : SingletonKK? {
return singletonKK
}
}
}
4.線程安全雙重校驗(yàn)
public class SingletonJ {
private static volatile SingletonJ singletonJ;
public static SingletonJ getInstance() {
if (singletonJ == null) {
synchronized (SingletonJ.class) {
if (singletonJ == null)
singletonJ = new SingletonJ();
}
}
return singletonJ;
}
}
LazyThreadSafetyMode.SYNCHRONIZED即鎖的意思
class SingletonLazy private constructor(){
companion object {
val Instance by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
SingletonLazy()
}
}
}
5.靜態(tài)內(nèi)部類
public class SingletonJ {
private static class SingletonHolder{
private static SingletonJ instance=new SingletonJ();
}
private SingletonJ(){
}
public static SingletonJ getInstance(){
return SingletonHolder.instance;
}
}
class SingletonLazy private constructor(){
companion object {
fun getInstance()= SingletonHolder.ins
}
private object SingletonHolder{
var ins = SingletonLazy()
}
}
結(jié)語
由于Kotlin自身語法簡潔的優(yōu)勢,寫單例模式也就一兩行的代碼,這里沒有深究一些高級用法,比如Lazy,屬于Kotlin延遲屬性的委托,有興趣的可以自己研究下。