create Cleaner
Начиная с Kotlin: 1.9
fun <T> createCleaner(resource: T, cleanupAction: (resource: T) -> Unit): Cleaner
Создаёт объект Cleaner, который запускает cleanupAction с указанным resource через некоторое время после освобождения этого ресурса.
Пример использования:
class ResourceWrapper {
private val resource = Resource()
private val cleaner = createCleaner(resource) { it.dispose() }
}
Когда ResourceWrapper становится неиспользуемым и освобождается, его cleaner также освобождается, а ресурс очищается позднее.
Не указано, в каком потоке выполняется cleanupAction, а также могут ли две или более функции очистки от разных очистителей выполняться параллельно.
Примечание: если resource ссылается (прямо или косвенно) на очиститель, то оба объекта могут утечь, и в этом случае cleanupAction не будет вызвана. Например, в приведённом ниже коде возникает утечка:
class LeakingResourceWrapper {
private val resource = Resource()
private val cleaner = createCleaner(this) { it.resource.dispose() }
}
В этом случае аргумент очистителя (LeakingResourceWrapper) не может быть освобождён до выполнения cleanupAction (it.resource.dispose()), которое может произойти только после освобождения очистителя, а тот, в свою очередь, не может быть освобождён до освобождения LeakingResourceWrapper. Таким образом, в этом случае требования к освобождению объектов противоречат друг другу, и эту ситуацию нельзя корректно обработать. Поэтому функция очистки не выполняется, а очиститель и его аргумент могут утечь (в зависимости от реализации). Та же проблема возникает, когда cleanupAction захватывает значение, которое ссылается (прямо или косвенно) на очиститель:
class LeakingResourceWrapper {
private val cleaner = createCleaner(...) {
doSomething()
...
}
private fun doSomething() {
...
}
}
В приведённом выше примере лямбда-функция очистки неявно захватывает объект this, чтобы вызвать doSomething().
cleanupAction не должна использовать глобальные переменные @ThreadLocal, поскольку она может выполняться в другом потоке.
Если cleanupAction выбрасывает исключение, поведение не определено.
Очистители нельзя использовать для выполнения действий при завершении программы:
очистители, на которые ссылаются глобальные переменные, вообще не будут собраны сборщиком мусора;
очистители, на которые перестали ссылаться непосредственно перед выходом из main(), могут не быть собраны сборщиком мусора, поскольку у сборщика мусора может не быть возможности запуститься.
Параметры
объект, для которого нужно выполнить cleanupAction
функция очистки для resource. Не должна ничего захватывать.
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.native.ref/create-cleaner.html