Есть ли еще более простой способ выражения анонимных классов в Котлине?

Я перевел эту Java

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

к этому Котлину

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

Но я чувствую, что есть более простой способ сделать это, однако я не могу найти примеров.

я пробовал

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

Но без успеха …

PS. Я знаю, что начинать тему вроде плохой практики.

Одна из проблем заключается в том, что конструктор класса Thread имеет параметры в плохом порядке для Kotlin. Для Runnable вы можете легко использовать преобразование SAM ( один интерфейс метода можно рассматривать как лямбда ), но поскольку лямбда не является последним параметром, он выглядит довольно неуклюжим. В случае, когда есть только один параметр, это нормально:

 Thread { val a = 3 }.start() 

Однако с более чем одним параметром они обращаются назад, вызывая этот более уродливый синтаксис с лямбдой в качестве параметра внутри круглой скобки:

 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()

Нет никакого способа реализовать анонимный класс (кроме конверсий SAM ).
Но вы все равно можете упростить свой код:

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

или с именем потока:

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

Вы правильно кодируете код. Единственный способ упростить его – извлечь логику в функцию и затем повторно использовать ее:

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

Применение:

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

Если вы хотите расширить / реализовать некоторый класс / интерфейс в своем анонимном классе, нет другого пути, кроме:

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

Простейшая возможная конструкция – это, конечно же,

 val adhoc = object{ // some code here } 

но нет более простого способа сделать это.

Документация , но вы, вероятно, читаете это.

Intereting Posts
Как создать пустой конструктор для класса данных в Kotlin Android Не требуется ли в Котлине? Как мне выполнить компиляцию пакетов в Maven? Regex: метасимвол для распознавания любого типа персонажа Настройка Jackson для использования SNAKE_CASE «глобально» в Spring Boot 2.0.0.M1 Анализ SimpleDateFormat Почему у меня есть нежелательный выход Log при слиянии 2 наблюдаемых в другие Observable, которые буферизуют их каждые 10 секунд Ошибка ввода типа. Firebase JobDispatcher Использование сокета для пользовательского протокола через tcp Конфигурируемый завод в Котлине для JavaScript Использование @ Component.Builder с параметрами конструктора Свойства конструктора Котлина и вызов различных конструкторов суперкласса Преобразование статических переменных из Java в Kotlin Связывание с JMM классами, определенными asm из Kotlin с использованием Gradle Как я могу перерисовать Anko frameLayout при изменении моей модели?