天天看点

【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)