2011-12-21 12 views
2

私はC++の開発者です。私はJavaでチェックされたチェックされていない例外でかなり新しいです。 C++の例外仕様はあまり良くないので、誰もそれを使用していません。私はチェック例外が好きで、私は疑問を持っている、のは、このインタフェースを持ってみましょう:チェックされた例外の仕様と戦略のパターン

public interface Warehouse { 
    MyStuff fetch(int id); 
} 

倉庫が異なる方法で実装することができます。ファイル、データベースまたはメモリで(テスト用モックオブジェクト)。

ファイルを使用して実装したい場合は、このメソッドでファイルを開こうとしません。それ以外の場合は、署名が変更され、クラスがインタフェースを実装しなくなります。また、別のチェックされた例外を持つ別のクラスがある場合、他の既存の実装はすべて影響を受けます。

私は2つのソリューションを見ることができます:

  1. がチェック例外をキャッチし、別のカスタムランタイム例外をスローします。私はこれが良い解決策ではないと考えています。なぜなら、ユーザーは実行時の例外をキャッチして、標準とチェックされた方法でファイルが見つからないということです。

  2. 実装クラスのコンストラクタでジョブ全体を実行し、フェッチ機能をスローすることはできません。私はこの方法が好きです、オブジェクトは存在し、有効であるか存在しません。このアプローチの唯一の欠点は、遅延評価を実装できないことです。誰もオブジェクトを使用しなくても、コンストラクタ内のファイルを読み込んで解析する必要があります。これは効率的ではありません。

私に何か不足していますか?この問題を回避するより良い方法はありますか?

+0

Uhohを、チェックされていない例外と未チェックの例外。それは多くの議論を生み出すでしょう。これは、Java開発者の間ではかなり宗教的な話題です。 – tobiasbayer

答えて

2

最初の解決法が正しいです。

public interface Warehouse { 
    MyStuff fetch(int id) throws FetchFailureException; 
} 

そして、すべてのサブクラスがIO、JDBC、または何らかの例外をFetchFailureException内にラップするようにします。このFetchFailureException例外は、回復不可能な場合は実行時に、回復可能である場合はチェックする必要があります。

+0

確認済みの例外を作成できるかどうかはわかりませんでした。私はあなたの要点を見ていますが、例外クラスの数は増えません。 –

+0

このような状況がたくさんある場合、1つのインターフェイスを使用して複数のデータソースをターゲットにし、それぞれ異なる種類の例外が発生します。これほど頻繁ではありません。そして、私はN(IO、SQL、Memory ...)よりむしろ1種類の例外(FetchFailureException)に対処することを好む。 –

0

個人的に、私は倉庫のリストにあなたがリストされていない例外がある場合は、あなたがそれを処理するか、それをラップする必要が

(のjavadocに未チェックのものも含めて)それは投げることができるすべての例外を持っているでしょう。 (チェックされているかどうか)

Warehouseにチェック例外をスローするかどうかを気にする必要があります。あなたはそれを両方向に持つことはできません。 (実際には、コンパイラが知らないうちに盲目的にチェック例外をスローすることはできませんが、良い考えではありません)

0

ベストプラクティスは、メソッドがインターフェイスでスローする例外を指定することです。

は、カスタム例外クラスがあるとします。

クラスMyExceptionは例外
{
公共MyException (文字メッセージ)
{スーパー(メッセージ)を拡張します。
}

公開 MyException(文字列メッセージ、例外原因)
{
super(message、 原因);
}

}

今、あなたはあなたの方法は、インタフェース

パブリックインターフェイス倉庫
に投げるべきで例外を指定することができ、

をMyExceptionクラス内のすべての例外を処理{

public MyStuff fetch()throws MyException;

}

0

私はあなたがWarehouseクラスすべての例外に含めると、このように、チェック例外を非で動作するために、サブインターフェイスで作業することをお勧め:

public interface Warehouse { 
    MyStuff fetch(int id) throws FileNotFoundException;; 
} 

public interface FileWarehouse extends Warehouse { 
    @Override 
    MyStuff fetch(int id) throws FileNotFoundException; 
} 

public interface OtherWarehouse extends Warehouse { 
    @Override 
    MyStuff fetch(int id); 
} 
+0

Warehouseを使用する1000の場所があり、SQLExceptionをスローする追加のサブクラスを導入し、 FileNotFoundException、あなたは1000のコンパイルエラーを修正する必要があります。 FetchFailureExceptionのようなドメイン固有の例外を使用し、その中に考えられるすべての例外をラップすると、この問題はもう発生しません。 –

+0

良い点。ありがとう。 – loscuropresagio

関連する問題