簡體   English   中英

我應該如何處理邏輯上無法訪問的代碼

[英]How should I handle logically unreachable code

我有一個 class 實現了一個接口,它迫使我實現 2 種方法 - fun check(): Booleanfun onCheckFalse(): Int

用法看起來像:

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

在我的實現中,我總是從check()返回true ,因此onCheckFalse()在邏輯上變得不可訪問。

我應該在那里做什么?

  1. 返回一些值,即使它沒有邏輯意義?
  2. 拋出異常? 哪一個?
  3. 還有別的嗎?

具體用例是kotlin ,但當然也歡迎提供一般性答案。

被迫實現在特定實現 class *中毫無意義的接口方法並不少見。

在 Java 中——因此在 Kotlin/JVM 中——通常的方法是拋出UnsupportedOperationException 看到這個問題 這樣,如果有人不經意地調用了您的方法,他們將很難發現您的 class 不提供該功能!

在特定情況下,該方法是一個通知或回調——為了類自身的利益而調用,而不是為調用者提供任何功能——那么告訴調用者它沒有實現是沒有意義的,所以最好的方法就是什么都不做的空方法。

(但是,OP 已澄清后者適用於此特定問題,盡管有on…()方法名稱。)


* UnsupportedOperationException的原始用例是針對不可變的 collections:在 Java 中,相同的接口(例如java.util.List )用於可變和不可變的 collections,因此指定變異方法以在調用不可變時拋出該異常collections。

當然,這種特殊情況不適用於 Kotlin,它將這些接口分為兩個:一個只讀超級接口(例如List )和一個添加了變異方法的子接口(例如MutableList )。

但是在其他情況下,實現可能無法實現某些方法。 例如,非事務性數據庫 class 可能無法回滾更改,或者沒有 alpha 通道的圖像可能無法設置透明度。

不過,我認為該異常被過度使用了。 如果您的 class 可以在某些情況下執行該操作,但在其他情況下不能執行操作(如我在網上找到的許多示例),那么拋出IllegalArgumentExceptionIllegalStateException可能更合乎邏輯且更有幫助。

理想情況下,將設計一個接口,以便任何實現都不需要拋出UnsupportedOperationException List示例表明,盡管 Kotlin 的集合接口比 Java 的稍微復雜一點,但它們的表現力更強; 您可以在編譯時判斷您擁有的是只讀集合還是讀/寫集合,這樣可以避免整個 class 的運行時錯誤。 因此,如果您正在設計界面,那么值得提前考慮並盡可能避免這種需要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM