2011-12-03 55 views
1

在我的GWT应用程序,我有一个类,像这样:GWT的ActivityMapper是否违反了Liskov替换原则?

public class AppActivityMapper implements ActivityMapper { 

    @Override public Activity getActivity(Place place) { 

     if(place instanceof ThisPlace) { 
      return new ThisActivity((ThisPlace)place); 
     } 
     if(place instanceof ThatPlace) { 
      return new ThatActivity((ThatPlace)place); 
     } 
     if(place instanceof AnotherPlace) { 
      return new AnotherActivity((AnotherPlace)place); 
     } 
     // you get the idea 
    } 
} 

的ActivityMapper,活动和地点对象是框架的一部分,接口意味着,这是它是怎样来使用。

但是,根据Liskov Substitution Principle,一种方法接受一个类型但检查子类来推断要采取的操作违反了该原则。

GWT的ActivityMapper接口本质上是否鼓励违反LSP?还是有另一种符合LSP标准的方法来编写我没有想到的方法?

回答

1

ActivityMapper的作用是将Place映射到Activity,其中映射的规则完全空闲。
这种if/else级联的原因是Java不支持multiple dispatch,但在我看来,这并不意味着它违反了LSP(或者至少,在Java中没有其他选择,所以这不是问题;您可以使用访问者模式 - 这就是Spring Roo生成的模式 - 但这不会改变很多事情)。

+1

更多阅读,我想违反LSP取决于你是否可以通过与子类调用此方法来破坏客户端。这似乎实际上是映射方法的意图,因此在这种情况下,instanceof's的if/else级联可能不会自动违反LSP。感谢提到访问者模式...似乎有更多关于此方法的实现的讨论[这里](http://stackoverflow.com/questions/5802747/eliminating-gwt-activitymapper-boilerplate)。 – Jay

相关问题