如何在 kotlin 中实现 finalize()?

     2023-02-23     42

关键词:

【中文标题】如何在 kotlin 中实现 finalize()?【英文标题】:How to implement finalize() in kotlin? 【发布时间】:2017-10-02 17:00:29 【问题描述】:

今天我在 kotlin 中实现 Closeable,就像我过去在 java 中所做的那样,我想实现 finalize() 作为最后的后备手段,以防客户端代码忘记关闭它,渲染未回收的关键资源。我认为这个资源足够重要,可以添加这个后备,尽管这个后备不可靠。但是,kotlin.Any 没有声明 finalize 方法,这意味着我不能简单地这样做:

class Resource: Closeable 
    fun close() 
    override fun finalize()  close()

这不好,至少没有它应该的那么好。现在我恢复到纯 Java 作为一种解决方法。有谁知道如何在纯 Kotlin 中做到这一点?

PS:我目前的解决方法:

FinalizedCloseable.java:

public abstract class FinalizedCloseable implement Closeable 
    @Override protected void finalize()  close(); 

科特林:

class Resource: FinalizedCloseable(), Closeable 
    fun close() 
    override fun finalize()  close()

但是这种解决方法需要一个超类。如果下次我的另一个 Resource 已经有了一个超类,那么如果没有大量样板文件,这个解决方法就行不通。


编辑:现在我知道如何实现 finalize(),但是 IDEA kotlin 插件不够聪明,无法知道这是一个终结器,因此用一些警告标记它。苦苦挣扎了一阵子,终于找到了如何抑制这些警告,特地分享一下:

class C 
    @Suppress("ProtectedInFinal", "Unused") protected fun finalize() 

【问题讨论】:

kotlinlang.org/docs/reference/java-interop.html#finalize @ean5533 呃,我没有完整阅读那么长的互操作文档,现在是我的惩罚。还是谢谢你。 你读过“finalize() called on strongly reachable object in Java 8”吗?最重要的是,你最好不要这样做。除非您的代码涉及直接处理系统资源的native 代码,否则您的类将成为实际代表资源的另一个对象的包装器,并让包装器的可访问性确定实际资源的生命周期(可能仍然可以访问并且使用中),意味着提出严重的问题…… @Holger 感谢您指出这一点。但我的问题是,只有一部分资源被一个处理程序消耗,其余的将存储在一个池中,直到另一个处理程序,甚至失败的处理程序再次被拉出。因此,偶尔失败一次在我的软件中不是问题。但是,我不想冒险失去他们中的任何一个,否则会有三百人的军队撞到我的前门。顺便说一句,在我的机器上,链接中示例中的FinalizeThis::finalize 在我的机器上从未调用过一次 这都是 JVM 特定的。除了过早被调用的危险之外,还有很大的可能永远不会被执行,至少不会在关键时间范围内。垃圾收集旨在管理内存,只要有足够的内存或垃圾收集器对回收不需要终结的对象的存储感到满意,它就可能不会运行或只是忽略具有终结器的对象。还有多线程问题…… 【参考方案1】:

official documentation 涵盖了这一点。

要覆盖 finalize(),你需要做的只是简单地声明它,而不使用 override 关键字:

class C 
    protected fun finalize() 
        // finalization logic
    

【讨论】:

秒杀我 :) 谢谢!这就是我所需要的!但是为什么 *** 禁止在粘贴 12 分钟之前选择 anwser... 好的,它可以工作,但是如何在其中调用super.finilize()?我反编译了生成的java代码,那里没有超级调用。 @Boris 是的,如果你扩展了一个有代码的类。但是,当您扩展的任何类都没有覆盖它时,就不需要它了。但是,如果您扩展的类允许它,您应该可以调用 super.finalize 并且一切正常。 但这有效吗?当对象准备好被释放时,这个函数会运行吗?

如何在 Kotlin 中实现 OnClickListener 接口? [复制]

】如何在Kotlin中实现OnClickListener接口?[复制]【英文标题】:HowtoimplementOnClickListenerinterfaceinKotlin?[duplicate]【发布时间】:2018-07-1322:39:02【问题描述】:如何在Kotlin中实现OnClickListener接口,就像我们在Java中一样,并处理像switchcase... 查看详情

如何在 Kotlin 中实现 switch-case 语句

】如何在Kotlin中实现switch-case语句【英文标题】:Howtoimplementswitch-casestatementinKotlin【发布时间】:2019-04-0720:31:25【问题描述】:如何在Kotlin中实现等价于Javaswitch语句代码?switch(5)case1://Docodebreak;case2://Docodebreak;case3://Docodebreak;【问... 查看详情

如何在 KOTLIN 中实现 buttonX.setOnClickListener(this)? [复制]

】如何在KOTLIN中实现buttonX.setOnClickListener(this)?[复制]【英文标题】:HowtoachievebuttonX.setOnClickListener(this)inKOTLIN?[duplicate]【发布时间】:2019-03-1920:40:12【问题描述】:我想在kotlin中将“this”上下文绑定到监听器【问题讨论】:与Jav... 查看详情

如何在 android studio 中实现 Admob 插页式广告 - Kotlin

】如何在androidstudio中实现Admob插页式广告-Kotlin【英文标题】:HowtoimplementAdmobInterstitialAdinandroidstudio-Kotlin【发布时间】:2021-08-2414:12:27【问题描述】:我是一名初学者,我需要帮助在androidstudio中使用Kotlin实施Admob插页式广告。对... 查看详情

如何使用 Kotlin 在 RecyclerView Adapter 中实现 onClick 并进行数据绑定

】如何使用Kotlin在RecyclerViewAdapter中实现onClick并进行数据绑定【英文标题】:HowtoimplementonClickinRecyclerViewAdapterwithdatabindingusingKotlin【发布时间】:2021-07-0707:40:38【问题描述】:我使用数据绑定创建了一个RecyclerView适配器,我正在... 查看详情

如何在 kotlin 中实现 List<data class>(子列表)的 parcelable?

】如何在kotlin中实现List<dataclass>(子列表)的parcelable?【英文标题】:HowtoimplementationparcelableforList<dataclass>(childlist)inkotlin?【发布时间】:2020-12-3119:44:51【问题描述】:我想用parcelable将数据类意图用于其他活动。但是当... 查看详情

使用 Kotlin 在 Android 中实现 WebSocket

】使用Kotlin在Android中实现WebSocket【英文标题】:WebSocketImplementationinAndroidusingKotlin【发布时间】:2019-11-3014:47:01【问题描述】:我正在尝试使用Kotlin在android中使用Web套接字实现简单的消息传输。我是kotlin的新手,我从工作的java... 查看详情

通用扩展类 AND 在 Kotlin 中实现接口

】通用扩展类AND在Kotlin中实现接口【英文标题】:GenericextendingclassANDimplementsinterfaceinKotlin【发布时间】:2015-12-2611:02:50【问题描述】:假设我想要一个类型变量T,它扩展了某个类并实现了一个接口。比如:classFoo<T:BarimplementsBa... 查看详情

如何在视图模型中实现 Firebase 电话身份验证?

】如何在视图模型中实现Firebase电话身份验证?【英文标题】:Howcanfirebasephoneauthbeimplementedinviewmodel?【发布时间】:2021-04-1004:42:00【问题描述】:我正在尝试使用Kotlin在视图模型中添加Firebase电话身份验证代码。问题是PhoneAuthProvi... 查看详情

kotlin中实现recyclerview嵌套recyclerview

实现如图的功能: 1、添加Gson依赖implementation\'com.google.code.gson:gson:2.8.7\' 使用 viewBinding,在build.gradle中 android下配置如下//AndroidStudio3.6androidviewBindingenabled=true//AndroidStudio4. 查看详情

kotlinforeach中实现break(代码片段)

...言切换为Kotlin后很多函数使用还不太习惯。最近就遇到了如何在forEach中使用break的问题。解决方式老规矩,先说解决方式,如果确定就是要在forEach类似函数中 查看详情

如何在基于 Java 的 Android 应用程序中实现 Datastore?

】如何在基于Java的Android应用程序中实现Datastore?【英文标题】:HowtoimplementDatastoreinjavabasedandroidapp?【发布时间】:2021-05-1000:32:30【问题描述】:我只能想办法通过Kotlin实现数据存储。我试过用DataStore&lt;Preferences&gt;datastore=... 查看详情

kotlin中实现匿名内部类

1.常规的方式实现匿名内部类valueAnimator.addUpdateListener(object:AnimatorUpdateListeneroverridefunonAnimationUpdate(animation:ValueAnimator?)currentPoint=animation?.animatedValueasPointpostInvalidate())2.lamb 查看详情

如何从 openapi 生成器编译一个在生成的源文件夹中实现接口的项目?

】如何从openapi生成器编译一个在生成的源文件夹中实现接口的项目?【英文标题】:HowcanIcompileaprojectthatimplementsinterfacesingeneratedsourcesfolderfromopenapigenerator?【发布时间】:2021-12-0903:06:13【问题描述】:我正在使用OpenAPI生成器maven... 查看详情

在 recyclerview kotlin 上实现搜索的问题

】在recyclerviewkotlin上实现搜索的问题【英文标题】:Issuesimplementingsearchonrecycleviewkotlin【发布时间】:2020-04-0105:58:15【问题描述】:我正在尝试在recyclerview中实现搜索选项。到目前为止我已经实现的是:创建了如下搜索栏:我在Ma... 查看详情

如何在类似于Java的kotlin中声明常量[重复]

】如何在类似于Java的kotlin中声明常量[重复]【英文标题】:HowtodeclareconstantsinkotlinsimilartoJava[duplicate]【发布时间】:2019-05-1001:07:06【问题描述】:在Java类中,我通常将所有常量声明在一个单独的整个项目的常量文件和访问如何在... 查看详情

从 Kotlin 实现 Java 接口时出现 NullPointerException

】从Kotlin实现Java接口时出现NullPointerException【英文标题】:NullPointerExceptionwhenimplementingJavainterfacefromKotlin【发布时间】:2019-12-2623:52:09【问题描述】:我正在尝试在Kotlin中从RxJava实现BiFunction接口,我得到了一个NullPointerException。... 查看详情

如何在 laravel 中实现 vuetify?

】如何在laravel中实现vuetify?【英文标题】:Howtoimplementvuetifyinlaravel?【发布时间】:2018-07-2123:32:58【问题描述】:我是vuetify的新手,我试图在laravel中实现它。有人已经在laravel中实现了vuetify,可以告诉我怎么做吗?我已经安装... 查看详情