Слабые ссылки

Слабые ссылки (Weak References) - это специальный тип ссылок, который позволяет объекту быть собранным сборщиком мусора, если на него больше нет сильных ссылок, но он остается в памяти, если на него есть хотя бы одна слабая ссылка. Использование слабых ссылок особенно полезно в случаях, когда нужно избежать утечек памяти, связанных с долгоживущими объектами или циклами ссылок.

Пример 1: Избегание утечек памяти при хранении в коллекции

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() для каждой слабой ссылки. Если объект все еще существует, его значение выводится на экран.

Пример 2: Предотвращение утечек памяти в анонимных классах

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.