簡體   English   中英

在所有實現中的接口的每個實現中添加另一種方法

[英]Add another method to every implementation of my Interface in all implementations

我有一個界面:

public interface InterfaceListener {
    void eventEnd();
}

一些方法將這個InterfaceListener接收為參數,當然每個方法都以自己的方式實現。 例如:

myObject.callMethod(false,InterfaceListener() {
    @Override
    public void eventEnd() {
        //do some extra code
    }
});

現在,我想添加一些更改,以確保eventEnd()中的每個實現都僅在通過另一個方法callMyExtraMethod()所有調用通用的callMyExtraMethod()之后callMyExtraMethod()調用,如下所示:

myObject.callMethod(false,InterfaceListener() {
    @Override
    public void eventEnd() {
        if (callMyExtraMethod()) {
            //do some extra code
        }
    }
});

有什么主意如何將其添加到邏輯中而不傳遞每個實現並手動將相同的檢查添加到所有邏輯中?

在IDE eventEnd eventEndImpl重命名為eventEndImpl 然后添加默認方法:

public interface InterfaceListener {
    default void eventEnd() {
        if (callMyExtraMethod()) {
            eventEndImpl();
        }
    }

    void eventEndImpl();
    // Uncomment, if this method must belong to the same class. 
    // bool callMyExtraMethod();
}

如果您使用的是Java 7,一種實現此目的的方法-

用抽象方法創建一個AbstractListener
eventEndcallMyExtraMethod以及模板方法templateMethod

public abstract class AbstractListener {

   public abstract void eventEnd();
   public abstract boolean callMyExtraMethod();

   public void templateMethod(){
    if(callMyExtraMethod()){
        eventEnd();
    }
  }
}

現在,您可以創建Anonymous類並調用templateMethod() 這將確保在調用eventEnd()之前對callMyExtraMethod()檢查

AbstractListener listener = new AbstractListener() {

        @Override
        public void eventEnd() {
            // your implementation
        }

        @Override
        public boolean callMyExtraMethod() {
            //System.out.println("I am callMyExtraMethod");
            return true;
        }
    };

    listener.templateMethod();

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM