Котлин, почему финализатор никогда не вызывается?

Я новичок в Kotlin и не могу понять, как работает метод finalize(). Я знаю Swift, и там есть метод deinit, который вызывается при уничтожении объекта. Как я могу проверить, был ли уничтожен объект в Kotlin.

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        printTC()
    }

    fun printTC(){
        var tc:TestClass? = TestClass()
        println(tc?.i)
        tc = null
    }

}

class TestClass{

    var i = 0

    init {
        test()
    }

    protected fun finalize(){
        println("TestClass freed")
    }

    fun test(){
        println("test")
    }
}

person Dinu Nicolae    schedule 03.03.2019    source источник


Ответы (1)


Не гарантируется, что сборка мусора запустится немедленно, когда больше не будет ссылок на объект, возможно, поэтому вы еще не видите, как работает метод finalize. Вы можете попытаться принудительно запустить его, вызвав System.gc(), но, в конечном счете, реализация сборщика мусора сама выбирает, когда запускать финализаторы, так что вам просто не следует полагаться на них в целом.

Сборка мусора Android может действовать по-разному по многим причинам, но, по крайней мере, в простом приложении командной строки JVM это работает так, как вы ожидаете:

fun main() {
    var tc: TestClass? = TestClass() // test
    tc = null
    System.gc() // TestClass freed
}
person zsmb13    schedule 03.03.2019