我有一個實作介面的類,它迫使我實作 2 個方法 -fun check(): Boolean和fun onCheckFalse(): Int.
用法如下所示:
if (check().not()) return onCheckFalse()
在我的實作中,我總是true從邏輯上無法到達check()。onCheckFalse()
我應該在那里做什么?
- 即使沒有邏輯意義也回傳一些值?
- 拋出例外?哪一個?
- 還有什么?
具體用例是 for kotlin,但當然也歡迎一般性的回答。
uj5u.com熱心網友回復:
被迫實作在特定實作類中沒有意義的介面方法并不少見*。
Java 中的常用方法——因此在 Kotlin/JVM 中——是拋出UnsupportedOperationException; 看到這個問題。這樣,如果有人無意中呼叫了你的方法,他們會發現你的類不提供該功能的困難方式!
在該方法是通知或回呼的特定情況下——為了類自身的利益而呼叫,而不是為呼叫者提供任何功能——那么告訴呼叫者它沒有實作是沒有意義的,所以最好的方法只是一個什么都不做的空方法。
(但是,OP 已經澄清,盡管有方法名稱,但后者不適用于這個特定的問題。)on…()
* for 的原始用例UnsupportedOperationException是用于不可變集合:在 Java 中,相同的介面(例如java.util.List)用于可變和不可變集合,因此指定變異方法以在對不可變集合呼叫時拋出該例外。
當然,這種特殊情況不適用于 Kotlin,它將這些介面分為兩個:一個只讀的超級介面(例如)和一個添加變異方法List的子介面(例如)。MutableList
但在其他情況下,實作可能無法實作某些方法。例如,非事務性資料庫類可能無法回滾更改,或者沒有 alpha 通道的影像可能無法設定透明度。
不過,我認為這個例外被過度使用了。如果你的類在某些情況下可以實作該動作,但在其他情況下不能實作——就像我在網上找到的許多示例一樣——那么拋出IllegalArgumentExceptionor可能會更合乎邏輯和更有幫助IllegalStateException。
理想情況下,將設計一個介面,使任何實作都不需要 throw UnsupportedOperationException。該List示例表明,盡管 Kotlin 的集合介面比 Java 的復雜一點,但它們更具表現力;您可以在編譯時判斷您是否有一個只讀集合或一個讀/寫集合,這樣可以避免一整類運行時錯誤。因此,如果您正在設計界面,則值得提前考慮并盡可能避免這種需要。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/466153.html
下一篇:如何從雙重轉換為物件?
