其他
“by” the way,探索Kotlin的委托机制
https://blog.csdn.net/weixin_43687181
lateinit var viewModel:MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ❗ 看下面
viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
// ❗ 看上面
findViewById<Button>(R.id.button).setOnClickListener {
viewModel.printSomething(System.currentTimeMillis().toString())
}
}
}
ViewModelProvider.NewInstanceFactory())
.get(MainViewModel::class.java)
class MainActivity : AppCompatActivity() {
lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory())
.get(MainViewModel::class.java)
}
}
class MainActivity : AppCompatActivity() {
// ❗ 看下面
private val mainViewModel by viewModels<MainViewModel>()
// ❗ 看上面
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
/*
等价于
lateinit var mainViewModel: MainViewModel
mainViewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory())
.get(MainViewModel::class.java)
*/
类委托:一个类,定义时实现了某个接口,就可以把该接口委托给一个对象(该对象可以通过构造函数传入),委托会自动进行拦截,把调用这个接口的操作转发给该对象。
属性委托:把一个变量通过by关键字,委托给别人操作。我们知道,对于一个变量而言,只有两个操作,分别是获取这个变量和修改这个变量,也就是get()和set()。委托就是把这两个操作进行拦截,然后分发给指定的委托对象进行执行。
private var lastKey = 0
override fun put(key: Int, value: Int): Int? {
lastKey = key
return realMap.put(key,value)
}
fun recover() {
realMap.remove(lastKey)
}
}
//取s指向的对象,然后调用方法
s.isBlank()
// 赋值给s
s = "2"
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
println("代理对象来喽,"+"当前时间:"+System.currentTimeMillis())
return "abcdefg"
}
}
fun main() {
val s: String by Delegate()
s.length
}
Process finished with exit code 0
// $FF: synthetic field
static final KProperty[] $$delegatedProperties = new KProperty[]{(KProperty)Reflection.property0(new PropertyReference0Impl(TKt.class, "s", "<v#0>", 1))};
public static final void main() {
// 注释1
Delegate var10000 = new Delegate();
KProperty var1 = $$delegatedProperties[0];
Delegate s = var10000;
// 注释2
s.getValue((Object)null, var1).length();
}
// $FF: synthetic method
public static void main(String[] var0) {
main();
}
}
// operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
// println("代理对象来喽,"+"当前时间:"+System.currentTimeMillis())
// return "abcdefg"
// }
fun myDelegate():String{
println("代理对象来喽,"+"当前时间:"+System.currentTimeMillis())
return "abcdefg"
}
}
fun main() {
val delegate = Delegate()
val s = delegate
s.myDelegate().length
}
把委托对象(对应上面例子中的s)实例化为一个被委托对象(对应例子中的Delegate对象)
每次对委托对象的方法调用,都会被转换成调用被委托对象的getValue()方法,该方法返回实质调用对对象
实质调用对对象执行原来的调用(对应例子中的length方法)