我的出发点的方法如下:
- 我有一个方法,变换,我重载不同的行为取决于所传入的参数类型(见变换(A a1,A a2)和变换(A a1,B b)在我的示例中)
- 所有这些参数实现相同的接口,X调用重载的所有参数实现相同的接口
我想在各种对象上应用该变换方法全部实现X界面。
我想到的是实现变换(X x1,X x2),它在应用变换的相关变体之前检查每个对象的实例。
尽管它有效,但代码看起来很难看,我也担心评估这些各种instanceof和cast的性能开销。这种转变是我在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);
}
我还发现了下面的帖子相关:http://sites.google.com/site/steveyegge2/when-polymorphism-failures – double07
性能应该不用担心 - 除非你打算非常频繁地运行这段代码。先让它工作,然后再优化。 – Bombe