我们这些在教堂/清真寺/犹太教堂/等处做礼拜的人。面向对象的设计经常在instanceof
. 我的问题是它是否是允许的,此外,在给定的上下文中更可取的是,您希望让另一个开发人员能够将预期类型的可变参数混合传递给一个入口点函数(foo
),以使他们的代码更简洁/更简单(又名正面):
// 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");
}
是的,这可以说有点笨拙,但是假设除了被视为对象之外,三种类型(整数、字符串、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隐藏的一些方法,你甚至可以推荐这种风格吗?毕竟,在这种情况下,包装类的重用范围是有限的,因为它们具有纯粹的父类范围。
在这种特定情况下,这两种方法的优缺点是什么?