有没有更简单的方式来表达Kotlin中的匿名类?
我翻译这个Java有没有更简单的方式来表达Kotlin中的匿名类?
new Thread("Cute Thread") {
public void run() {
int a = 3;
}
}.start();
这个科特林
object : Thread("Cute Thread") {
override fun run() {
val a = 3
}
}.start()
但我觉得有这样做的一个简单的方法,但我找不到任何的例子。
我已经试过
Thread("Cute Thread") { val a = 3 }.start()
,但没有成功...
PS。我知道像这样开始一个线程是一个不好的习惯。
的一个问题是,Thread
类的构造函数有一个参数糟糕的Kotlin订单。对于Runnable
,您可以轻松使用SAM conversion(单个方法接口可以视为lambda),但由于lambda不是最后一个参数,它看起来有点笨重。在那里只有一个参数的情况下,它是罚款:
Thread { val a = 3 }.start()
然而,随着多个参数,它们是向后造成这种丑陋的语法与拉姆达为括号内的参数:
Thread({ val a = 3 }, "some name").start()
相反,你应该使用科特林STDLIB功能thread()
你所拥有的简单的语法功能:
// create thread, auto start it, runs lambda in thread
thread { val a = 3 }
// create thread with given name, auto start it, runs lambda in thread
thread(name = "Cute Thread") { val a = 3 }
// creates thread that is paused, with a lambda to run later
thread(false) { val a = 3 }
// creates thread that is paused with a given name, with a lambda to run later
thread(false, name = "Cute Thread") { val a = 3 }
如果你想扩展/在你的匿名类实现一些类/接口,没有其他办法比:
object: Thread("Name"){
//...
}.start()
最简单的结构当然是:
val adhoc = object{
// some code here
}
但有并不是简单的方法来做到这一点。
Documentation,但你可能读过。
没有什么不同的方式来实现匿名类(SAM conversions除外)。
但你仍然可以通过简化代码:
Thread({ val a = 3 }).start()
或线程名:
Thread({ val a = 3 }, "Cute Thread").start()
你的代码是完全正确的。简化它的唯一方法是将其解压缩逻辑成一个函数,然后再用它:
fun newThread(name: String, block:() -> Unit): Thread {
return object : Thread(name) {
override fun run() = block()
}.start()
}
用法:
这里newThread("Cute Thread") {
val a = 3
}
如果你准备写这样的函数,在stdlib中已经有了一个可供你使用的函数:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/thread.html – Ilya
太棒了!谢谢! – PedroD
@PedroD答案已经现代化 –