私の出発点は以下の通りです:
- 私は渡された引数の型によって異なった振る舞いをするメソッドを持っています
- これらの引数はすべて同じインターフェイスを実装しています。Xすべての引数が同じインターフェイスを実装するオーバーロードされたメソッドを呼び出す
私はこの変換メソッドをすべて実装するさまざまなオブジェクトに適用したいと思いますXインタフェース。
私が思い描いたのは、トランスフォームの関連バリアントを適用する前に各オブジェクトのインスタンスをチェックするtransform(X x1、X x2)を実装することでした。
このコードは動作しますが、コードは醜いようですが、これらのさまざまなインスタンスとキャストを評価するためのパフォーマンスオーバーヘッドも懸念しています。その変換はJavaでできるか、同じ動作を達成するためのよりエレガントで効率的な方法ですか?
以下は、BAを印刷する簡単で実用的な例です。私はそのコードを改善する方法の例を探しています。私の実際のコードでは、当然「変換」の実装が増えていますが、以下のような簡単な実装はありません。
public class A implements X {
}
public class B implements X {
}
interface X {
}
public A transform(A a1, A a2) {
System.out.print("A");
return a2;
}
public A transform(A a1, B b) {
System.out.print("B");
return a1;
}
// Isn't there something better than the code below???
public X transform(X x1, X x2) {
if ((x1 instanceof A) && (x2 instanceof A)) {
return transform((A) x1, (A) x2);
} else if ((x1 instanceof A) && (x2 instanceof B)) {
return transform((A) x1, (B) x2);
} else {
throw new RuntimeException("Transform not implemented for "
+ x1.getClass() + "," + x2.getClass());
}
}
@Test
public void trivial() {
X x1 = new A();
X x2 = new B();
X result = transform(x1, x2);
transform(x1, result);
}
関連サイトhttp://sites.google.com/site/steveyegge2/when-polymorphism-fails – double07
パフォーマンスを心配する必要はありません。コードのセクションを非常に頻繁に実行する予定がある場合を除き、パフォーマンスは心配しないでください。最初に動作させ、後で最適化します。 – Bombe