【问题标题】:Kotlin - Is there a smart way to throw NotImplementedError for all the methods of a class?Kotlin - 是否有一种聪明的方法可以为类的所有方法抛出 NotImplementedError?
【发布时间】:2017-10-29 13:38:06
【问题描述】:

我需要实现一个具有数百种方法的接口 (ResultSet)。 现在,我将只实现这些方法的一个子集,为其他方法抛出一个NotImplementedError

在 Java 中我找到了两种解决方案:

  1. 创建一个抽象类AbstractResultSet实现ResultSet,声明所有方法抛出NotImplementedError。没有 hack,但有很多样板代码。
  2. 使用Proxy.newProxyInstance 一起实现InvocationHandler 中的所有方法。代码更少,但对其他编码人员的使用也不太直接。

Kotlin 中有第三种选择吗?

就我而言,我需要在 IBM 数据集(包含压缩小数、二进制字段、分区数字、可变长度的行等)上实现 ResultSet,以通过 SQLServerBulkCopy 将其导入 SQLServer。我不知道这个类调用了哪些ResultSet 方法,所以,现在,我将只实现“最常用”的方法,记录对未实现方法的调用。

【问题讨论】:

    标签: reflection kotlin resultset sqlbulkcopy packed-decimal


    【解决方案1】:

    检查标准的 TODO 函数,它标记了一个 todo 并抛出一个 NotImplementedError

    /**
     * Always throws [NotImplementedError] stating that operation is not implemented.
     *
     * @param reason a string explaining why the implementation is missing.
     */
    @kotlin.internal.InlineOnly
    public inline fun TODO(reason: String): Nothing = throw NotImplementedError("An operation is not implemented: $reason")
    

    用法:

    fun foo() {
            TODO("It will be soon")
        }
    

    通过这种方式,您还可以使用 IDE 的“todo”选项卡找到未实现的功能。这是一个加分项。

    【讨论】:

    • 这个答案是对@Andrew 解决方案的改进,但基本上是相同的想法。我会扩展接口,为每个方法提供一个带有 TODO 的默认实现。很简单,IDE 可以完成这项工作,但我会生成大量样板代码。
    【解决方案2】:

    您可以创建一个继承自ResultSet 的接口MyResultSet,并实现所有抛出NotImplementedError 的方法。这就像你在 Java 中的第一个解决方案,但它现在是一个接口而不是一个类,并且给你更多的灵活性。希望有所帮助。

    interface MyResultSet : ResultSet {
        fun bar() ...
        fun foo() {
            throw NotImplementedError()
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-07
      • 2012-12-27
      • 1970-01-01
      • 2020-08-28
      • 2011-05-24
      • 1970-01-01
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多