Слабые ссылки
Слабые ссылки (Weak References
) - это специальный тип ссылок, который позволяет объекту быть собранным сборщиком мусора, если на него больше нет сильных ссылок, но он остается в памяти, если на него есть хотя бы одна слабая ссылка. Использование слабых ссылок особенно полезно в случаях, когда нужно избежать утечек памяти, связанных с долгоживущими объектами или циклами ссылок.
import java.lang.ref.WeakReference
fun main() {
val weakRefList = mutableListOf<WeakReference<MyClass>>()
// Создание объектов и добавление их в коллекцию как слабые ссылки
for (i in 1..5) {
val obj = MyClass(i)
val weakRef = WeakReference(obj)
weakRefList.add(weakRef)
}
// Удаление сильных ссылок на объекты
System.gc()
// Печать объектов, которые еще не были собраны сборщиком мусора
for (weakRef in weakRefList) {
val obj = weakRef.get()
if (obj != null) {
println("Object: ${obj.value}")
} else {
println("Object has been garbage collected")
}
}
}
data class MyClass(val value: Int)
В этом примере создается коллекция weakRefList
, в которой хранятся слабые ссылки на объекты класса MyClass
. После создания объектов сборщик мусора вызывается с помощью System.gc()
. После этого проверяется, были ли объекты удалены сборщиком мусора, путем вызова get()
для каждой слабой ссылки. Если объект все еще существует, его значение выводится на экран.
import java.lang.ref.WeakReference
interface Callback {
fun onResult(result: String)
}
fun main() {
val callback: Callback? = object : Callback {
override fun onResult(result: String) {
println("Result: $result")
}
}
val weakCallback = WeakReference(callback)
// Дополнительные операции
// Проверка, что callback не был собран сборщиком мусора
if (weakCallback.get() != null) {
// Вызов метода интерфейса
weakCallback.get()?.onResult("Success")
} else {
println("Callback object has been garbage collected")
}
}
В этом примере создается анонимный класс, реализующий интерфейс Callback
, и его объект присваивается переменной callback
. Затем создается слабая ссылка на этот объект. После дополнительных операций проверяется, был ли объект удален сборщиком мусора, и если нет, вызывается метод onResult()
интерфейса Callback
.