0

我们这些在教堂/清真寺/犹太教堂/等处做礼拜的人。面向对象的设计经常在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隐藏的一些方法,你甚至可以推荐这种风格吗?毕竟,在这种情况下,包装类的重用范围是有限的,因为它们具有纯粹的父类范围。

在这种特定情况下,这两种方法的优缺点是什么?

4

0 回答 0