¿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.

  • Actividad de Kotlin no incluida en APK
  • Incremento automático al documento Firestre desde listView
  • Obtener el porcentaje de orientación en píxeles mediante progtwigción
  • Kotlin en Android: asigna un cursor a una list
  • ¿Cómo manejar correctamente los valores de Byte superiores a 127 en Kotlin?
  • ¿Cuál es la diferencia entre manejar campos a través de "accesor" y "copyr"
  • Kotlin en estudio de Android
  • Kotlin Advertencia de security nula Tokens inesperados (uso; para separar expresiones en la misma línea)
  • java.lang.VerifyError al escribir testings de Android con rasgos en Kotlin
  • kotlin consiguiendo un suscriptor para observar un observable usando RxJava2
  • ¿Puedo aprovechar las Corutinas de Kotlin al usarlas en código Java?