GWT的ActivityMapper是否违反Liskov替换原则?

时间:2011-12-03 15:27:37

标签: gwt liskov-substitution-principle

在我的GWT应用程序中,我有一个类似的类:

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,Activity和Place对象是框架的一部分,界面暗示这就是它的用法。

但是,根据Liskov Substitution Principle,接受类型但对子类进行类型检查以推断要采取的操作的方法违反了原则。

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

1 个答案:

答案 0 :(得分:1)

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