结冰的离季
本帖最后由 结冰的离季 于 2021-8-19 22:02 编辑

众所周知 C++ 里面有个与构造函数相对的析构函数,可以在该对象释放时运行函数内容
我想把它实现到Kotlin里面,当我查阅资料时发现Java有个finalize()方法,可以在垃圾回收时调用。
按照kt官方文档Calling Java from Kotlin | Kotlin (kotlinlang.org)
于是我写了以下方法
  1. protected fun finalize() = print(1)
复制代码

但我试的时候,发现他不可靠,直接关服没反应(不算垃圾回收),Java一些教程也说过这个东西不可靠。


我知道Java没有析构这个概念,但它真的太好用了,所以我想问问有没有办法实现,或者类似的功能,

贺兰兰
有的,finalize() 是 java.lang.Object 的 protected 方法,你需要先 @override 然后实现它

Java 不推荐使用析构函数的原因是因为完全无法预判 GC 何时回收对象,因此析构函数的调用是不确定的

如果你一定需要使用析构函数,那么则说明你的程序设计有问题(

结冰的离季
贺兰兰 发表于 2021-8-19 22:00
有的,finalize() 是 java.lang.Object 的 protected 方法,你需要先 @override 然后实现它

Java 不推荐使 ...

c++ java kt 同时写,人嘛了,设计出来的大杂烩= =

纱夜
类似的功能
你要找的是不是AutoClose或者Closeable之类的接口

I/O Stream还有Connection之类都需要手动close 或者试试twtr

不知道"close"这个算不算类似的功能

https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.html

海螺螺
本帖最后由 海螺螺 于 2021-8-19 23:26 编辑

你需要 ReferenceQueue,jdk 会有一个包装好的 Cleaner 类;关服再处理你可能想要 shutdown hook




不要用 finalize


EM_13LV
书上的0-0再看看

结冰的离季
海螺螺 发表于 2021-8-19 23:22
你需要 ReferenceQueue,jdk 会有一个包装好的 Cleaner 类;关服再处理你可能想要 shutdown hook



我试了Shutdown hook 尴尬的是




这也太晚了!Bukkit的东西就操作不了了

3TUSK
同 1 楼贺兰,C++ 有析构函数是因为不用的对象的内存不会被释放,需要你手动 delete(即需要手动管理内存)。这一点在 Java 中并不成立:一般的 JVM GC 实现都会在发现对象闲置后把内存重新标记为可用,根本不需要你去管理内存。

因此,楼主你问出了一个 XY 问题:你到底遇到了什么需求,需要你清理对象?!