我应该如何处理逻辑上无法访问的代码

How should I handle logically unreachable code

我有一个 class 实现一个接口,它迫使我实现 2 种方法 - fun check(): Booleanfun onCheckFalse(): Int

用法类似于:

if (check().not()) return onCheckFalse()

在我的实现中,我总是从 check() return true 所以 onCheckFalse() 在逻辑上变得不可访问。

我应该在那里做什么?

  1. Return 一些值,即使它没有逻辑意义?
  2. 抛出异常?哪一个?
  3. 还有别的吗?

具体用例适用于 kotlin,但当然也欢迎提供一般性答案。

被迫实现在特定实现中毫无意义的接口方法的情况并不少见 class*.

Java 以及 Kotlin/JVM 中的常用方法是 抛出 UnsupportedOperationException; see this question。这样,如果有人 无意中调用了您的方法,他们将很难发现您的 class 不提供该功能!

在特定情况下,该方法是一个通知或回调——为了 class 自身的利益而调用,而不是向调用者提供任何功能——那么没有必要告诉调用者它是没有实现,所以最好的方法就是一个什么都不做的空方法。

(但是,OP 已澄清后者 适用于此特定问题,尽管 on…() 方法名称。)


* UnsupportedOperationException 的原始用例用于不可变集合:在 Java 中,相同的接口(例如 java.util.List)用于可变和不可变集合,因此指定变异方法在不可变集合上调用时抛出该异常。

当然,这种特殊情况不适用于 Kotlin,它将这些接口分成两部分:read-only super-interface(例如 List), and a sub-interface (e.g. MutableList),它添加了变异方法.

但是在其他情况下,实现可能无法实现某些方法。例如,non-transactional 数据库 class 可能无法回滚更改,或者没有 alpha 通道的图像可能无法设置透明度。

不过,我认为异常会 over-used。如果您的 class 可以在某些情况下执行该操作,但在其他情况下不能执行该操作——就像我在网上找到的许多示例一样——那么抛出 IllegalArgumentExceptionIllegalStateException 可能更合乎逻辑且更有帮助相反。

理想情况下,接口的设计应使任何实现都不需要抛出 UnsupportedOperationExceptionList 示例表明,尽管 Kotlin 的集合接口比 Java 的集合接口复杂一点,但它们更具表现力;你可以在编译时判断你有一个 read-only 集合还是一个 read/write 集合,这避免了整个 class 的 run-time 错误。因此,如果您正在设计界面,那么值得提前考虑并尽可能避免这种需要。