我的出發點的方法如下:
- 我有一個方法,變換,我重載不同的行爲取決於所傳入的參數類型(見變換(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