Kotlin中單例模式和Java的對比淺析
前言
單例模式,一直以來是我們在日常開發(fā)中最常用的一種設(shè)計模式,更是面試中非常重要,也非常容易被問到的問題。在日常開發(fā)中,大家常用的語言還是Java,但今天我給大家?guī)淼氖窃贙otlin語言中,單例模式是怎么編寫的,并且會對比Java方式,下面話不多說了,來一起看看詳細的介紹吧
一、懶人寫法(惡漢式)
java中
public class Singleton{ public static final Singleton instance = new Singleton(); public Singleton getInstance() { return instance; } }
kotlin中
最簡單的寫法,直接用object聲明
object Singleton{}
二、基本懶加載(未實現(xiàn)線程同步)
注:這種方式實現(xiàn)了懶加載,但是不是線程安全的,可能在多個線程中創(chuàng)建多個不同的實例
java中
public class Singleton { public static Singleton instance = null; private Singleton (){} public Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
kotlin中
class Singleton private constructor{ companion object { val intance by lazy(LazyThreadSafetyMode.NONE) { Singleton() } } }
三、線程同步單例1
注:其實kotlin這種寫法可以說是java直譯過來的,雖說是線程安全的,但是太影響效率,主要看下面這種
java中
public class Singleton { private static Singleton instance = null; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
kotlin中
class Singleton private constructor(){ companion object { lateinit var instance: Singleton @Synchronized fun get(): Singleton { if (instance == null) { instance = Singleton(); } return instance!! } } }
四、線程同步單例2
注:線程同步,懶加載,無同步引起的效率問題
java中雙檢鎖單例
public class Singleton { private static Singleton instance = null; private Singleton (){} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
kotlin
class Singleton private constructor(){ companion object { val intance by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { Singleton() } } }
五、靜態(tài)內(nèi)部類單例
java中
public class Singleton { private Singleton (){} private static class Holder { private static Singleton instance = new Singleton(); } public static Singleton getInstance(){ return Holder.instance; } }
kotlin中
class Singleton private constructor(){ companion object { fun getInstance(): Singleton { return Holder.instance } } private object Holder { val instance = Singleton() } }
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
android開發(fā)教程之獲取power_profile.xml文件的方法(android運行時能耗值)
在Android手機中,對于手機中的每個部件(cpu、led、gps、3g等等)運行時對應(yīng)的能耗值都放在power_profile.xml文件中2014-02-02Android 實現(xiàn)通知消息水平播放、無限循環(huán)效果
Android 實現(xiàn)通知消息水平播放、無限循環(huán)效果非常常見,今天小編給大家分享實例代碼感興趣的朋友參考下吧2017-08-08基于Android實現(xiàn)保存圖片到本地并可以在相冊中顯示出來
App應(yīng)用越來越人性化,不僅界面優(yōu)美而且服務(wù)也很多樣化,操作也非常方便。通過本篇文章給大家介紹基于Android實現(xiàn)保存圖片到本地并可以在相冊中顯示出來,對android保存圖片相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2015-12-12Android依據(jù)名字通過反射獲取在drawable中的圖片
依據(jù)圖片的名字,通過反射獲取其在drawable中的ID,在根據(jù)此ID顯示圖片,具體實現(xiàn)如下,感興趣的朋友可以參考下哈2013-06-06