天天看點

【Kotlin】委托和代理、單例

文章目錄

  • ​​委托和代理​​
  • ​​單例​​

委托和代理

【Kotlin】委托和代理、單例

我們建立一個IWashBowl接口,裡邊有一個洗碗的方法

interface IWashBowl {
  fun washing()
}      

現在有大頭兒子和小頭爸爸,大頭兒子洗碗賺1塊錢,小頭爸爸賺10塊錢

class BigHeadSon:IWashBowl {
  override fun washing(){
    println("我是大頭兒子,我洗碗賺1塊錢")
  }
}
class SmallHeadFather:IWashBowl {
  override fun washing(){
    println("我是小頭爸爸,我洗碗賺10塊錢")
  }
}      

測試代碼

fun main(args: Array<String>) {
  var son = BigHeadSon()
  son.washing()
  
  var father = SmallHeadFather()
  father.washing()
}      
【Kotlin】委托和代理、單例

那麼什麼是代理和委托呢,拿上邊的例子來說明,當小頭爸爸再有洗碗任務時,可以讓大頭兒子來洗,我們小頭爸爸的代碼

class SmallHeadFather:IWashBowl by BigHeadSon() {
  
}      

寫測試代碼

fun main(args: Array<String>) {
  var father = SmallHeadFather()
  father.washing()
}      
【Kotlin】委托和代理、單例

SmallHeadFather中也是可以重寫

class SmallHeadFather:IWashBowl by BigHeadSon() {
  override fun washing(){
    println("我是小頭爸爸,我看着大頭兒子洗碗")
    BigHeadSon().washing()
    println("最終我還是賺了10塊錢")
  }
}      

再次運作

【Kotlin】委托和代理、單例

單例

其實上邊的代碼是有瑕疵的,小頭爸爸的​

​BigHeadSon().washing()​

​​會建立出了一個大頭兒子,如果測試代碼中已經有​

​var son = BigHeadSon()​

​的話,就有2個大頭了

var a = BigHeadSon();
  var b = BigHeadSon();
  println(a == b)      
【Kotlin】委托和代理、單例

是以我們需要用到單例,先展示 Java 常見寫法

public class Singleton{
  private static Singleton instance;
  
  private Singleton(){}
  
  public synchronized static Singleton getInstance(){
    if(instance == null){
      instance = new Singleton();
    }
    return instance;
  }
  public void singletonTest(){
    System.out.println("singletonTest is called");
  }
}      

調用單例中方法時,

Singleton singleton = Singleton.getInstance();
singleton.singletonTest();      

在Kotlin 中建立單例十分簡單,隻要把關鍵字​

​class​

​​改為​

​object​

​​。我們來用 Kotlin 建立一個單例

【Kotlin】委托和代理、單例
object Singleton {
    fun singletonTest(){
        println("singletonTest is called")
    }
}      

調用單例類中的函數也很簡單

Singleton.singletonTest();      

下面修改 之前的栗子

object BigHeadSon:IWashBowl {
  override fun washing(){
    println("我是大頭兒子,我洗碗賺1塊錢")
  }
}      

小頭爸爸的代碼也需要修改,把小括号即可,代表我們不需要重新建立BigHeadSon了,并且大頭兒子在記憶體中有且僅有一個

class SmallHeadFather:IWashBowl by BigHeadSon {
  override fun washing(){
    println("我是小頭爸爸,我看着大頭兒子洗碗")
    BigHeadSon.washing()
    println("最終我還是賺了10塊錢")
  }
}      
var a = BigHeadSon;
  var b = BigHeadSon;
  println(a == b)