繁体   English   中英

避免在Java接口实现中使用instanceof

[英]Avoid instanceof in Java interface implementation

假设以下情况:

public interface A {
    void a1();
    void a2();
}

public interface B {
    void b1(A a);
}

public class ImplA implements A {
    // interface methods
    void a1() {};
    void a2() {};
    // ImplA specific methods
    void a3() {};
}

public class ImplB implements B {
    void b1(A a) {
       if(a instaceof ImplA) { // avoid instanceof test and cast 
          ((ImplA)a).a3(); 
       }
    }
}

一些架构巫毒是否有可能避免在ImplB.b1()中检查实例? ImplA和ImplB在同一个包中并且彼此密切相关。 我在某处读到,使用instanceof是一个“不那么好”的界面设计的暗示。 有什么建议? 非常感谢!

您可以使用访问者模式来避免强制转换

public interface Visitor {
    void visitImplA(ImplA toVisit);
}

public class VisitorImpl implements Visitor {

    @Override
    public void visitImplA(ImplA toVisit) {
        toVisit.a3();
    }
}

public interface A {
    void a1();
    void a2();
    void accept(Visitor visitor);
}

public interface B {
    void b1(A a);
}

public class ImplA implements A {
    // interface methods
    void a1() {};
    void a2() {};
    // ImplA specific methods
    void a3() {};

    void accept(Visitor visitor) {
        visitor.visitImplA(this);
    }
}

public class ImplB implements B {
    void b1(A a) {
        a.accept(new VisitorImpl());
    }
}

这将消除你所有的实例检查并将它们分成访问者和实现类,这种模式就足以满足你在大多数实例检查之后做同样的事情,否则你需要大量的实现访问者界面

你想要的VooDoo是作曲。 您可以使用Visitor dessign模式解决这个问题。 但是当你使用它时会受到一些惩罚。 或者,您可以创建将用于调用该a3方法的onther接口。

案件varry。 问题的原因可能是您的体系结构不是由您构建的,并且您尝试做一些奇怪的事情或您的课程执行很多事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM