代码之家  ›  专栏  ›  技术社区  ›  Newbie

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

  •  2
  • Newbie  · 技术社区  · 7 年前

    1 回复  |  直到 7 年前
        1
  •  4
  •   Jayson Minard    7 年前

    这已经在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)
    

    这个 只是一个简单的类型别名,它与预期的接口匹配,这意味着它与现有代码兼容,并且实现了抑制内部异常。 (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 ,等等,对于每个平台。。。