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)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
android開發(fā)教程之獲取power_profile.xml文件的方法(android運行時能耗值)
在Android手機中,對于手機中的每個部件(cpu、led、gps、3g等等)運行時對應(yīng)的能耗值都放在power_profile.xml文件中2014-02-02
Android 實現(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)知識感興趣的朋友一起學習吧2015-12-12
Android依據(jù)名字通過反射獲取在drawable中的圖片
依據(jù)圖片的名字,通過反射獲取其在drawable中的ID,在根據(jù)此ID顯示圖片,具體實現(xiàn)如下,感興趣的朋友可以參考下哈2013-06-06

