How Kotlin helps you avoid memory leaks
Kotlin ввел множество новых механизмов, которые упрощают написание кода в Android:
👉 null safety
👉 type inference
👉 закрытые от наследования классы по умолчанию
👉 все вложенные классы по умолчанию статические
Но в дополнение ко всем ещё Kotlin может помогать вам избегать утечек памяти.
class SampleActivity : Activity() { override fun onCreate(savedState: Bundle?) { super.onCreate(savedState) setContentView(R.layout.activity_leak) button.setOnClickListener { startAsyncWork() } } private fun startAsyncWork() { val work = Runnable { SystemClock.sleep(20000) } Thread(work).start() }}Такой код не вызовет утечки в Android, хотя его аналог в Java бы вызывал.
Разница заключается в том, что лямбда в Kotlin интерпретируется как статический вложенный класс, и не хранит ссылку на внешний класс, если код внутри не обращается к внешним нестатическим элементам. В Java независимо от каких-либо условий всегда будет создаваться обычный класс.
Замечание: вышеприведенное рассматривается для Java 7, так как Android разработка сейчас использует эту версию в байт коде. Для Java 8 лямбды исполняются с помощью invokedynamic, что оптимизирует их выполнение.