在类似API的Facade上下文中允许使用instanceof

时间:2012-12-12 14:15:44

标签: java instanceof facade

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

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

0 个答案:

没有答案