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

在这里插入图片描述
那么什么是代理和委托呢,拿上边的例子来说明,当小头爸爸再有洗碗任务时,可以让大头儿子来洗,我们小头爸爸的代码

class SmallHeadFather:IWashBowl by BigHeadSon() {
	
}

写测试代码

fun main(args: Array<String>) {
	var father = SmallHeadFather()
	father.washing()
}

在这里插入图片描述
SmallHeadFather中也是可以重写

class SmallHeadFather:IWashBowl by BigHeadSon() {
	override fun washing(){
		println("我是小头爸爸,我看着大头儿子洗碗")
		BigHeadSon().washing()
		println("最终我还是赚了10块钱")
	}
}

再次运行
在这里插入图片描述

单例

其实上边的代码是有瑕疵的,小头爸爸的BigHeadSon().washing()会创建出了一个大头儿子,如果测试代码中已经有var son = BigHeadSon()的话,就有2个大头了

	var a = BigHeadSon();
	var b = BigHeadSon();
	println(a == b)

在这里插入图片描述
所以我们需要用到单例,先展示 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 创建一个单例
在这里插入图片描述

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)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值