たとえば、 getFoo() メソッドを使用して Foo オブジェクトを取得する必要があります。
Foo foo = getFoo();
この後、 getFoo() が Foo オブジェクトを正常に返さなかった場合を処理したいと考えています。これには、次の 2 つのケースが含まれます。
- getFoo() は例外をスローします。
- getFoo() の戻り結果は、null、空の文字列、0、または「空の結果」として扱われるべきものです。
理想的には、 getFoo() が空の結果を返す代わりに例外をスローすることを望みますが、それは私が所有していない別のパッケージのメソッドへの呼び出しである場合があります。
これらは私が考えることができる方法です:
1. 重複処理コード
Foo foo = null;
try {
foo = getFoo();
} catch (ResourceNotFoundException ex) {
logger.warn("blablabla");
foo = defaultFoo;
someOtherComplicatedStuff();
}
if (null == foo) {
logger.warn("blablabla");
foo = defaultFoo;
someOtherComplicatedStuff();
}
これは間違いなく良い考えではありません。
2. 処理ロジックを個別の関数に移動
Foo foo = null;
try {
foo = getFoo();
} catch (ResourceNotFoundException ex) {
handleNullFoo(var1, var2, var3, var4);
}
if (null == foo) {
handleNullFoo(var1, var2, var3, var4);
}
問題は、ロジックが多くのローカル変数を使用する可能性があることです。これらの変数を外部関数に渡すことはあまり意味がありません。さらに悪いことに、このプロセス中に一部の変数を変更する必要がある場合があります。引数がプリミティブ型の場合に発生する可能性がある問題は言うまでもなく、関数内の引数を変更することは良い習慣ではないと思います。
3.偽の例外をスローする
Foo foo = null;
try {
foo = getFoo();
if (null == foo) {
throw new ResourceNotFoundException();
}
} catch (ResourceNotFoundException ex) {
logger.warn("blablabla");
foo = defaultFoo;
someOtherComplicatedStuff();
}
これは最もクリーンな方法ですが、一種のハックに似ています。例外クラスが属していないパッケージで ResourceNotFoundException をスローするのは適切でない場合があります。また、例外が関数内で処理されていることに気付かない可能性があるため、コードの可読性も低下します。
それで、あなたの提案は何ですか?
どうもありがとうございました!