首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一个Kotlin-多平台特性或模式可以帮助实现一个通用的抽象,比如说,关闭的接口?

是否有一个Kotlin-多平台特性或模式可以帮助实现一个通用的抽象,比如说,关闭的接口?
EN

Stack Overflow用户
提问于 2018-11-17 21:49:18
回答 1查看 685关注 0票数 2

Java中的可关闭接口提供了一个方便的抽象,可以方便地管理可以关闭的资源。在多平台kotlin的上下文中,是否有一种模式、实践或特性可以帮助打破共享/多平台可关闭接口与实际Java可关闭接口之间的差距,同时知道它们必然是两种不同的类型?

无法关闭类型差异和/或具有标准库关闭的影响是无法跨库组合的可关闭接口的激增,尽管它们本质上是相同的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-17 22:24:29

这已经在kotlinx库的Kotlin团队为你做了。

https://github.com/Kotlin/kotlinx-io

对于Closeable,您应该直接使用该库,不需要创建自己的库。

但是,如果您想要创建类似的跨平台抽象,这将是一个很好的示例。这是它在被子下面做的事情..。

公共实现,它实际上执行关闭的逻辑,只希望每个平台都有可用的接口:(来源)

代码语言:javascript
复制
expect interface Closeable {
    fun close()
}

inline fun <C : Closeable, R> C.use(block: (C) -> R): R {
    try {
        val result = block(this)
        close()
        return result
    } catch (first: Throwable) {
        try {
            close()
        } catch (second: Throwable) {
            first.addSuppressedInternal(second)
        }
        throw first
    }
}

@PublishedApi
internal expect fun Throwable.addSuppressedInternal(other: Throwable)

JVM版本只是一个简单的类型别名,它与预期的接口匹配,这意味着它与现有代码兼容,并实现了抑制内部异常。(来源)

代码语言:javascript
复制
actual typealias Closeable = java.io.Closeable

@PublishedApi
internal actual fun Throwable.addSuppressedInternal(other: Throwable) {
    AddSuppressedMethod?.invoke(this, other)
}

private val AddSuppressedMethod: Method? by lazy {
    try {
        Throwable::class.java.getMethod("addSuppressed", Throwable::class.java)
    } catch (t: Throwable) {
        null
    }
}

JS版本的是一个新的接口:(来源)

代码语言:javascript
复制
actual interface Closeable {
    actual fun close()
}

@PublishedApi
internal actual fun Throwable.addSuppressedInternal(other: Throwable) {
}

对于原生的,类似于JS。,等等对于每个平台..。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53355873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档