美文网首页Kotlinkotlin
Kotlin单例模式

Kotlin单例模式

作者: Heweii | 来源:发表于2019-07-21 23:02 被阅读0次

    前言

    前三篇主要讲了下Kotlin语言的基本用法,以后在写关于Kotlin文章的时候可以java和Kotlin一起写,对比起来看会比较好。这篇文章主要讲一下Kotlin中单例模式的用法,主要以代码为主。

    1.饿汉式

    java的写法比较简单

    public class SingletonJ {
    
        public static SingletonJ singletonJ = new SingletonJ();
    
        public static SingletonJ getInstance() {
            return singletonJ;
        }
    
    }
    

    Kotlin自带单例,如下创建就行


    1563717483(1).jpg
    object SingletonK {
    }
    

    查看Kotlin字节码发现其实原理都是一样的


    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翻译,还有一种写法就有点复杂了,私有构造函数,我们也用到了他的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延迟属性的委托,有兴趣的可以自己研究下。

    相关文章

      网友评论

        本文标题:Kotlin单例模式

        本文链接:https://www.haomeiwen.com/subject/provlctx.html