私の出発点は次のとおりです
。-渡される引数のタイプに応じて異なる動作をするようにオーバーロードしたメソッドtransformがあります(transform(A a1、A a2)およびtransform(A a1、B b)を参照)以下の私の例では)
-これらの引数はすべて同じインターフェイスXを実装しています
その変換メソッドを、すべてXインターフェイスを実装しているさまざまなオブジェクトに適用したいと思います。
私が思いついたのは、transform(X x1、X x2)を実装することでした。これは、変換の関連するバリアントを適用する前に、各オブジェクトのインスタンスをチェックします。
それは機能しますが、コードは醜いようで、これらのさまざまなインスタンスの評価とキャストのパフォーマンスのオーバーヘッドも心配しています。その変換は、Javaで実行できる最善の方法ですか、それとも同じ動作を実現するためのよりエレガントで効率的な方法がありますか?
以下は、BAを印刷する簡単な実例です。そのコードを改善する方法の例を探しています。私の実際のコードでは、当然、「transform」の実装が多く、以下のように簡単なものはありません。
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);
}