簡體   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