是否有 Kotlin-Multiplatform 功能或模式可以帮助实现通用抽象,比如 Closeable 接口?
Is there a Kotlin-Multiplatform feature or pattern that can help to implement a common abstraction for, say, the Closeable interface?
Java中的Closeable接口提供了一个方便的抽象,便于管理可以关闭的资源。在多平台 kotlin 的上下文中,是否有一种模式、实践或功能可以帮助打破 shared/multi-platform Closeable 接口和实际的 Java Closeable 接口之间的差距,知道它们必然是两种不同的类型?
无法关闭具有标准库 closeable 的类型差异 and/or 的影响是无法跨库组合的 Closeable 接口的激增,即使它们从根本上是相同的。
这已经在 Kotlin 团队的 kotlinx-io 库中为您完成。
https://github.com/Kotlin/kotlinx-io
对于 Closeable
,您应该直接使用该库,无需创建自己的库。
但是如果您想创建自己的类似跨平台抽象,这可以作为一个很好的示例。这是它在幕后所做的事情...
通用实现,它实际上执行关闭逻辑,只是希望每个平台都有可用的接口:(source)
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版本只是一个简单的类型别名,匹配预期的接口意味着它与现有代码兼容,并实现抑制内部异常。 (source)
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版本是新界面:(source)
actual interface Closeable {
actual fun close()
}
@PublishedApi
internal actual fun Throwable.addSuppressedInternal(other: Throwable) {
}
对于native it is similar to JS,每个平台依此类推...
Java中的Closeable接口提供了一个方便的抽象,便于管理可以关闭的资源。在多平台 kotlin 的上下文中,是否有一种模式、实践或功能可以帮助打破 shared/multi-platform Closeable 接口和实际的 Java Closeable 接口之间的差距,知道它们必然是两种不同的类型?
无法关闭具有标准库 closeable 的类型差异 and/or 的影响是无法跨库组合的 Closeable 接口的激增,即使它们从根本上是相同的。
这已经在 Kotlin 团队的 kotlinx-io 库中为您完成。
https://github.com/Kotlin/kotlinx-io
对于 Closeable
,您应该直接使用该库,无需创建自己的库。
但是如果您想创建自己的类似跨平台抽象,这可以作为一个很好的示例。这是它在幕后所做的事情...
通用实现,它实际上执行关闭逻辑,只是希望每个平台都有可用的接口:(source)
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版本只是一个简单的类型别名,匹配预期的接口意味着它与现有代码兼容,并实现抑制内部异常。 (source)
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版本是新界面:(source)
actual interface Closeable {
actual fun close()
}
@PublishedApi
internal actual fun Throwable.addSuppressedInternal(other: Throwable) {
}
对于native it is similar to JS,每个平台依此类推...