2

「チェックされているチェックされていない例外」のトピックについては、SOにはかなりの記事があります。 This answerは、おそらく最も多面的で有益なものです。しかし、私はそこに提示された論理に従うためにまだ矛盾しており、その理由があります。理論にチェックされているものを使用する場合は、関連するビルトイン未チェック例外を使用する必要がありますか?

私は互いに類似したサービスのセットの周りにラッパーAPIを構築しています。しかし、それらの間には軽微な違い(または将来の可能性)があるため、(セカンダリとショートカットの)特定の機能が一部のサービスでサポートされ、他の機能によってサポートされない可能性があります。だから、次のアプローチで行くのは論理的だと思われます:

public interface GenericWrapperInterface { 
    void possiblyUnsupportedOperation() throws java.lang.UnsupportedOperationException; 
} 

なぜUnsupportedOperationException?それはこの種の状況のた​​めに設計されているからです。

しかし、Oracleのown manualに加えて、すべての関連する投稿では、クライアントが回復できた問題、または予測可能だが回避不可能な問題を通知するために例外が使用された場合、 1。一部の操作では、使用できない可能性が事前にわかっている可能性があり、操作は重要ではなく、必要な場合は避けることができるため、これらの要件に準拠しています。

私はこの謎に迷っています。例外的な使用法の一般的なロジックに違反する必要がありますか?それとも独自のチェックされた代替コードを作成してコードを複製し、APIユーザー間で混乱を招くのでしょうか?

+0

操作がサポートされていないことが判明している場合は、発生してはならないプログラミングエラーであるため、未確認例外を呼び出す必要があります。 – ZhongYu

+0

@ ZhongYuでは、クライアントコードはサポートの欠如の可能性を認識している可能性がありますが、各特定の実装オブジェクトがそのサポートを持っているかどうかは、実行時までは不明です。 – Semisonic

答えて

0

経験則では、チェックされていない例外はプログラマエラーを表し、チェック例外は状況を表します。したがって、APIの作者は、例外的な条件がプログラマによって事前に防止されるべきかどうか、またはプログラマがそれが発生した後にその状態に対処する必要があるかどうかを判断する必要があります。

2

「UnsupportedOperationException」は、Java OOモデルの障害、特にLiskovの原則に違反していることを示します。

通常、それはあなたのコードは、他の持っている、非OOは問題のメソッドが呼び出されるべきかどうかを判断するための手段を意味します

if (instance.isSupportive()) instance.possiblyUnsupportedOperation(); 

そのため、実装されていないメソッドを呼び出すとアサーションと同等の、論理エラーですスタックオーバーフロー、メモリ不足のいずれかが発生します。したがって、チェックされた例外であってはなりません。

+0

私はあなたが言っていることを得る。ただし、インターフェイスには、サポートされているかどうかにかかわらず、多数のメソッドがあります。それぞれに個別のテスターメソッドを作成するか、メソッドをいくつかのEnumにマッピングしてメソッド記述子をテスター関数に渡します。それはコード化さえも醜い解決策ではありませんか?結局のところ、Collections FrameworkのもののようなJavaのコアクラスでさえ、特定の操作が特定のコンテナに対して利用可能かどうかを示すために 'UnsupportedOperationException'を使用します。 Javaは既に不完全なので、独自のルールに従うべきではありませんか? – Semisonic

+0

使用できないメソッドが日常的に呼び出され、その例外をある種の帯域外の戻り値として使用すると思われる場合は、私の想定以上に設計がオフになります。その場合は、 'UnsupportedOperationException'ではなく、他のCHECKED例外を使用してください。 – Arkadiy

+0

Collections Frameworkの 'UnsupportedOperationException'を考慮する:その一例は、変更不可能なコレクションのメソッドを変更することです。その場合、要素を盲目的に追加するだけでは不十分です。つまり、UnmpodifiableListでadd()を呼び出すと論理エラーになります。あなたのケースは異なるようです。 OOデザインを見直してください... – Arkadiy

関連する問題