是否有更简单的方法在Kotlin中表达匿名课程?

时间:2016-09-19 08:47:55

标签: kotlin

我翻译了这个Java

new Thread("Cute Thread") {
  public void run() {
    int a = 3;
  }
}.start();

到这个Kotlin

object : Thread("Cute Thread") {
  override fun run() {
     val a = 3
  }
}.start()

但我觉得这样做的方法比较简单,但我找不到任何例子。

我已经尝试了

  Thread("Cute Thread") { val a = 3 }.start()

但没有成功......

PS。我知道开始这样的线程是一种不好的做法。

4 个答案:

答案 0 :(得分:4)

实现匿名类没有不同的方式(SAM conversions除外) 但您仍然可以通过以下方式简化代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;

namespace LoginSystem
{
    public class dialog_SignUp : DialogFragment
    {
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            base.OnCreateView(inflater, container, savedInstanceState);
        }
    }
}

或使用主题名称:

 Thread({ val a = 3 }).start()

答案 1 :(得分:2)

您的代码绝对正确。简化它的唯一方法是将逻辑提取到函数中然后重用它:

fun newThread(name: String, block: () -> Unit): Thread {
    return object : Thread(name) {
        override fun run() = block()
    }.start()
}

用法:

newThread("Cute Thread") {
    val a = 3
}

答案 2 :(得分:1)

如果你想在你的匿名类中扩展/实现一些类/接口,除了:

之外别无他法。
object: Thread("Name"){
    //...
}.start()

最简单的结构当然是:

val adhoc = object{
    // some code here
}

但没有更简单的方法可以做到这一点。

Documentation,但你可能已经读过了。

答案 3 :(得分:1)

这里的一个问题是Thread类构造函数的参数在Kotlin中的顺序不正确。对于Runnable,您可以轻松使用SAM conversion单个方法接口可以视为lambda ),但因为lambda不是最后一个参数,所以它看起来有点笨重。如果只有一个参数就可以了:

Thread { val a = 3 }.start()

但是,如果有多个参数,它们会向后导致这种更丑陋的语法,并将lambda作为括号内的参数:

Thread({ val a = 3 }, "some name").start()

相反,你应该使用Kotlin 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 } 

另请参阅:thread() function documentation