我们这些在教堂/清真寺/犹太教堂/等地进行崇拜的人。面向对象的设计经常吐在instanceof
面前。我的问题是它是否是允许的,而且,在给定的上下文中,你想让另一个开发人员能够将一个预期类型的可变混合传递给一个入口点函数(foo
),以制作他们的代码terser / simpler(又名Facade):
// a lightweight demo of the integral idea behind the Facade DP...
public void foo(Object... objs){
for(Object o : objs){
if(o instanceof Integer) bar((Integer)o);
else if(o instanceof MyCustomType) bar((MyCustomType)o);
else if(o instanceof String) bar((String)o);
//else{...} ignore? report exception?
}
}
private void bar(int i){
System.out.println("integer overload invoked");
}
private void bar(String s){
System.out.println("String overload invoked");
}
private void bar(MyCustomType instance){
System.out.println("MyCustomType overload invoked");
}
是的,这可能有点难看,但假设除了被视为对象之外,三种类型(Integer,String,MyCustomType)之间没有多态性,使用instanceof
而不是编写辅助包装器并不容易每种预期类型的对象:
private abstract class Wrapper<T>{
abstract void meth(T t);
}
private class StringWrapper extends Wrapper<String>{
@Override
void meth(String s){
System.out.println("String overload invoked");
}
}
// etc...
就OO而言,这是更好的设计,但是你应该总是使用包装方法吗?
或者在效率或记忆方面甚至可能存在这种方法的缺点?看到instanceof
的使用仅限于调用Facade隐藏的一些方法,你甚至可以推荐这种风格吗?毕竟,在这种情况下,包装类的重用范围有限,因为它们具有纯粹的父类范围。
在这种特定背景下,这两种方法的优缺点是什么?