2016-12-03 12 views
3

例外フロー制御を避け、アンチパターンとみなす理由を説明する記事が多数あります。ただし、次の例では例外フロー制御の使用は意味がありますか?特定のシナリオで例外フロー制御を改善していますか?

例:多くの値を持つ列挙型があり、指定された文字列が含まれているかどうかを確認する必要があります。

Enum.valueofを使用するソリューションは、IllegalArgumentExceptionをスローし、falseを返すために使用できます。 Apacheでもlang3 libは同じものを使用しています。以降のすべての呼び出しで、1回の遅延の初期化されたenumConstantDirectoryマップを再利用します。

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

その他の解決方法があります。

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

実際には多くの記事がありますが、すべての問題は例外がフロー制御の一形態であることです。 Controllはスローポイントからキャッチポイントに転送されます。それが彼らのためのものであり、他の制御方法に勝る優位性は、例外を除いてデータを取ることです。プログラミングの決定は、無意味なドグマではなく、論理に基づいて行われるべきである。 – EJP

答えて

6

プログラミングは常に「非公式な基準」との間でバランスをとると、それは理にかなっているルールから逸脱についてです。

はい、Javaは、あなたが「飛び越す前に見る」(状況をチェックする)言語の1つです。 Pythonのようにあなたが許しを求めないで "許してほしい"とは思えません。

つまり、ほとんどの場合、Javaプログラマは、制御フローの例外を使用するコードを見ると驚くかもしれません。しかし、それはが決してがこのように動作するはずではないということを意味するものではありません。

ここでは私の個人的な2セント:私はその場合は、あなたのプログラムの中で本当の例外条件を示すときあなたは例外に頼るべきだと思います。意味:チェックしている文字列が列挙定数を表すはずです...例外よりも良いかもしれません。しかし、実行時に文字列が無効であるという確かな理由(そしておそらく "有効な"理由)があるときは、むしろboolean isValid()というメソッドを使用して例外をスローしません。

+0

..理由を見つけられない*なぜ*無効ですか?例外があなたに伝えることは何ですか? – EJP

関連する問題