前言
前三篇主要讲了下Kotlin语言的基本用法,以后在写关于Kotlin文章的时候可以java和Kotlin一起写,对比起来看会比较好。这篇文章主要讲一下Kotlin中单例模式的用法,主要以代码为主。
1.饿汉式
java的写法比较简单
public class SingletonJ {
public static SingletonJ singletonJ = new SingletonJ();
public static SingletonJ getInstance() {
return singletonJ;
}
}
Kotlin自带单例,如下创建就行
object SingletonK {
}
查看Kotlin字节码发现其实原理都是一样的
2.懒汉式
public class SingletonJ {
public static SingletonJ singletonJ;
public static SingletonJ getInstance() {
if (singletonJ == null)
singletonJ = new SingletonJ();
return singletonJ;
}
}
Kotlin的写法比较多,可以直接从java翻译,还有一种写法就有点复杂了,私有构造函数,我们也用到了他的get()方法。注意:companion object 修饰为伴生对象,伴生对象在类中只能存在一个,类似于java中的静态方法 Java 中使用类访问静态成员,静态方法。
class SingletonKK private constructor(){
companion object {
private var singletonKK : SingletonKK? = null
get() {
if (field == null)
field = SingletonKK()
return field;
}
fun get() : SingletonKK? {
return singletonKK
}
}
}
创建的时候直接可以
var instance:SingletonKK = SingletonKK.get()!!
当然还有一种简便的实现方式,LazyThreadSafetyMode.NONE线程非安全
class SingletonLazy private constructor(){
companion object {
val Instance by lazy(mode = LazyThreadSafetyMode.NONE) {
SingletonLazy()
}
}
}
3.线程安全的懒汉式
java中实现线程安全用到了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.线程安全双重校验
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.静态内部类
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()
}
}
结语
由于Kotlin自身语法简洁的优势,写单例模式也就一两行的代码,这里没有深究一些高级用法,比如Lazy,属于Kotlin延迟属性的委托,有兴趣的可以自己研究下。