この問題を解決するには、戦略デザイン パターンで Java Generics を使用できます。
Case1 と Case2 の 2 つの「ケース」があり、各ケースの doSomething() メソッドを持つクラスを「ハンドラー」と呼びます。
まず、Handler を定義するインターフェースを用意します。
public interface Handler<TYPE1, TYPE2, TYPE3>{
void doSomething(TYPE1, TYPE2, TYPE3);
void doSomethingElse(TYPE3);
}
ハンドラーは次のようになります。
public class Case1Handler implements Handler<Case1Type1, Case1Type2, Case1Type3>{
public void doSomething(Case1Type1 t1, Case1Type2 t2, Case1Type3 t3){
// do case 1 business
}
public void doSomethingElse(Case1Type3 t3){
// do case 1 business
}
}
Case2 にも同様の実装があります。
今、あなたはまだ doSomething() と doSomethingElse() の同じビジネスを 2 回コーディングしています。ここで戦略パターンが役立ちます。
基本的に、さまざまなタイプのオブジェクトに対して同じビジネスを実行しています。これらの違いを別のクラス (The Strategy) に移動し、この戦略をHandlerの1 つの実装に注入できます。
public class HandlerImpl<TYPE1, TYPE2, TYPE3> implements Handler<TYPE1, TYPE2, TYPE3>{
private Strategy<TYPE1, TYPE2, TYPE3> strategy;
public HandlerImpl(Strategy<TYPE1, TYPE2, TYPE3> strategy){
this.strategy = strategy;
}
public void doSomething(TYPE1 t1, TYPE2 t2, TYPE3 t3){
// do your business using "strategy"
}
public void doSomethingElse(TYPE3 t3){
// do your business using "strategy"
}
}
これはやり過ぎに思えるかもしれませんが、決してそうではありません。これにより、コードがよりクリーンになり、変更 (新しいケースの追加、ビジネスの変更) が実装しやすくなります:)