2016-12-03 79 views
3

有很多文章解釋了爲什麼異常流量控制應避免與被認爲是一個反模式。但是,在以下示例中使用異常流控制是否有意義?在某些情況下,異常流量控制是否更好?

例如:我有一個枚舉類型有很多值,需要檢查它是否包含給定的字符串。

使用Enum.valueof的解決方案應該拋出一個IllegalArgumentException並且可以用來返回false。即使是Apache commons lang3 lib也使用相同的。我們在所有後續調用中重複使用一次lazy initialized enumConstantDirectory映射。

return EnumUtils.isValidEnum(MyEnum.class, myValue); 

其他的解決方案是迭代。

return Stream.of(MyEnum.values()).anyMatch(e -> e.name().equals(value)); 
+3

確實有很多這樣的文章,但所有這些文章的問題是,異常*是流量控制的一種形式。 Controll從投擲點轉移到捕捉點。這就是他們爲*所做的,而他們對其他形式的控制的優勢在於他們會接受一些數據 - 例外 - 與他們一起。編程決定應該基於邏輯,而不是無意義的教條。 – EJP

回答

6

編程是總是關於「非正式標準」之間的平衡,以及在有意義的規則偏離。是的,Java是你「看着你跳躍」(你檢查條件)的語言之一;不像Python那樣「請求寬恕」(不是爲了許可)。換句話說:大多數情況下,程序員會發現查看使用控制流異常的代碼是令人驚訝的。但是:這並不意味着一個從來沒有應該這樣工作。

我個人的2%的位置:我認爲你應該靠例外,當這種情況下,表示你的程序真正異常情況。意思是:當你正在檢查的那些字符串應該代表枚舉常量...比一個異常可能是好的。但是,當有在運行時有一定機會(甚至是「有效」的原因),一個字符串是無效的,那麼我寧願使用去boolean isValid(),而不是拋出異常的方法。

+0

..並沒有找出原因*爲什麼*它是無效的?這是什麼例外可以告訴你? – EJP

相關問題