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

  • Configuración jvmArgs para informes Allure
  • ¿Cómo agrego create-react-kotlin-app como module al proyecto kotlin-multiplataforma?
  • Cómo crear el flask gordo con gradle kotlin script
  • Mockito ArgumentCaptor para la function de Kotlin
  • El receptor de difusión onReceive () no se llama
  • Google Espresso: borre los datos del usuario en cada testing
  • SpringBoot ArrayIndexOutOfBoundsException MethodParameter.getGenericParameterType
  • Actividad de tabs en Kotlin (Android Studio)
  • Tienda lambda en una variable en kotlin
  • RxJava cómo crear Observable a partir de una Suscripción
  • Kotlin - Restringir el scope del método de extensión