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

  • Crear una class POJO para Kotlin
  • ActivityTestRule.getActivity devuelve nulo en el método Before
  • Retrofit: get un cuerpo vacío en la actualización de respuesta
  • Kotlin: UnsupportedOperationException para el genérico reificado con el operador get / set
  • Kotlin constructor con super class
  • Crear método con un parámetro genérico para acciones repetidas
  • Constantes en Kotlin: ¿cuál es una forma recomendada de crearlos?
  • ¿Cuáles son las reglas de inferencia de punto y coma en Kotlin?
  • Cómo condicionar la comprobación como i <J in para loop kotlin
  • Usar interfaces funcionales con types de funciones en Kotlin
  • Accediendo a las properties de bean Java desde Kotlin