我应该如何处理逻辑上无法访问的代码
How should I handle logically unreachable code
我有一个 class 实现一个接口,它迫使我实现 2 种方法 - fun check(): Boolean
和 fun onCheckFalse(): Int
。
用法类似于:
if (check().not()) return onCheckFalse()
在我的实现中,我总是从 check()
return true
所以 onCheckFalse()
在逻辑上变得不可访问。
我应该在那里做什么?
- Return 一些值,即使它没有逻辑意义?
- 抛出异常?哪一个?
- 还有别的吗?
具体用例适用于 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 可以在某些情况下执行该操作,但在其他情况下不能执行该操作——就像我在网上找到的许多示例一样——那么抛出 IllegalArgumentException
或 IllegalStateException
可能更合乎逻辑且更有帮助相反。
理想情况下,接口的设计应使任何实现都不需要抛出 UnsupportedOperationException
。 List
示例表明,尽管 Kotlin 的集合接口比 Java 的集合接口复杂一点,但它们更具表现力;你可以在编译时判断你有一个 read-only 集合还是一个 read/write 集合,这避免了整个 class 的 run-time 错误。因此,如果您正在设计界面,那么值得提前考虑并尽可能避免这种需要。
我有一个 class 实现一个接口,它迫使我实现 2 种方法 - fun check(): Boolean
和 fun onCheckFalse(): Int
。
用法类似于:
if (check().not()) return onCheckFalse()
在我的实现中,我总是从 check()
return true
所以 onCheckFalse()
在逻辑上变得不可访问。
我应该在那里做什么?
- Return 一些值,即使它没有逻辑意义?
- 抛出异常?哪一个?
- 还有别的吗?
具体用例适用于 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 可以在某些情况下执行该操作,但在其他情况下不能执行该操作——就像我在网上找到的许多示例一样——那么抛出 IllegalArgumentException
或 IllegalStateException
可能更合乎逻辑且更有帮助相反。
理想情况下,接口的设计应使任何实现都不需要抛出 UnsupportedOperationException
。 List
示例表明,尽管 Kotlin 的集合接口比 Java 的集合接口复杂一点,但它们更具表现力;你可以在编译时判断你有一个 read-only 集合还是一个 read/write 集合,这避免了整个 class 的 run-time 错误。因此,如果您正在设计界面,那么值得提前考虑并尽可能避免这种需要。