¿Existe alguna forma más simple de express classs anónimas en Kotlin?

Traducí este Java

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

a este Kotlin

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

Pero creo que hay una manera más simple de hacerlo, sin embargo, no puedo encontrar ningún ejemplo.

He intentado

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

Pero sin éxito …

PD. Sé que comenzar un hilo así es una mala práctica.

Un problema aquí es que el constructor de la class Thread tiene parameters en mal order para Kotlin. Para Runnable , puede usar fácilmente una conversión SAM ( una única interfaz de método puede tratarse como una lambda ), pero como la lambda no es el último parámetro, parece un poco torpe. En el caso donde solo hay un parámetro, está bien:

 Thread { val a = 3 }.start() 

Sin embargo, con más de un parámetro, están al revés causando esta syntax más fea con el lambda como parámetro dentro del paréntesis:

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

En su lugar, debe usar el thread() function stdlib de Kotlin thread()

Con esa function tienes una syntax más simple de:

 // 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 } 

Ver también: documentation de la function thread()

No existe una forma diferente de implementar una class anónima (excepto las conversiones de SAM ).
Pero aún puedes simplificar tu código de la siguiente manera:

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

o con el nombre del hilo:

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

Tu código es absolutamente correcto. La única forma de simplificarlo es extraer la lógica en una function y luego reutilizarla:

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

Uso:

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

Si desea extender / implementar alguna class / interfaz en su class anónima, no hay otra manera que no sea:

 object: Thread("Name"){ //... }.start() 

La construcción más simple posible es, por supuesto:

 val adhoc = object{ // some code here } 

pero no hay una manera más simple de hacer esto.

Documentación , pero probablemente leas eso.

  • Android Retrofit + SimpleXmlConverter con entidad vacía
  • java.lang.VerifyError creando una tarea de gradle con kotlin
  • modificador de visibilidad privada y subpackages
  • Kotlin: ¿Por qué esta function no es elegible para la recursion de queue?
  • El pact proveedorVerify no está recogiendo el file JSON Pact
  • Android Retrofit Get Query codificado
  • ¿Puedo iniciar un valor perezoso dependiendo del constructor?
  • Problemas henetworkingando la class interna de Java
  • Al aplicar el complemento 'kotlin-android' en una aplicación instantánea, se obtiene como resultado que "null no se puede convertir a tipo no nulo com.android.build.gradleBasePlugin"
  • Referencia no resuelta: T
  • Error con java8 y Kotlin