我對此從單個接口派生一些類的數據模型,如:基於使用instanceof或reflection的類的類型的切換方法?
public interface Foo extends Visitable {}
public class BarA implements Foo {
void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class BarB implements Foo {
void accept(Visitor visitor) {
visitor.visit(this);
}
}
...
也有一個Visitor
具有用於做一些與數據模型中的類的一些方法:
public class ModelVisitor implements Visitor {
String visit(Foo foo) {
// ...
}
String visit(BarA bar) {
// ...
}
String visit(BarB bar) {
// ...
}
// ...
}
說,我得到了Foo
類型的集合,遍歷它們的元素,並調用visit()
:
void run(List<Foo> fooList) {
for(Foo foo : fooList) {
// here is the question
foo.visit();
}
}
我如何決定調用哪個visit()
方法,因爲它們都是foo的所有子類?我有兩個可能的想法:
- 使用
instanceof
和轉換爲正確的類型,但我想避免,因爲我會在很多if
,else if
條件結束。 - 我的另一種方法是使用反射。該應用程序將在Java7中運行,這就是爲什麼我可以在
switch-case
語句中使用字符串比較的原因。
例如:
String visit(List<Foo> fooList) {
for(Foo foo : fooList) {
switch(foo.getClass().getName()) {
case "BarA":
visit((BarA) foo);
break;
case "BarB":
visit((BarB) foo);
break;
// ...
}
}
}
在我看來,第二種方法看起來比使用instanceof
清潔,但反射被稱爲慢。我的JVM知識不太好,但我認爲instanceof
也將使用反射來獲取對象的類型,所以兩種解決方案之間沒有真正的性能差異。
你會使用什麼或有其他方法來解決這個問題?
你應該改寫你的問題,如「如何切換基於類型的訪問者方法」,或者簡單地「訪問者模式如何工作」 –