在所有实现中,为我的接口的每个实现添加另一种方法

时间:2016-09-01 04:05:46

标签: java oop inheritance interface

我有一个界面:

public interface InterfaceListener {
    void eventEnd();
}

有些方法接收此InterfaceListener作为参数,当然每个方法都以自己的方式实现它。例如:

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

现在我想添加一些更改,以确保eventEnd()中的每个实现只有在它传递了另一个方法 - callMyExtraMethod()之后才会被调用,这对所有调用都是通用的,类似于的是:

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

任何想法如何将其添加到逻辑中而不传递每个实现并手动将相同的检查添加到所有实现?

2 个答案:

答案 0 :(得分:2)

在IDE中将eventEnd重命名为eventEndImpl。然后添加默认方法:

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

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

答案 1 :(得分:0)

如果您使用的是Java 7,实现此目的的一种方法 -

使用抽象方法创建AbstractListenereventEndcallMyExtraMethod以及模板方法templateMethod

public abstract class AbstractListener {

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

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

现在您可以创建匿名类并调用templateMethod()。这将确保在调用callMyExtraMethod()

之前进行eventEnd()检查
AbstractListener listener = new AbstractListener() {

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

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

    listener.templateMethod();

希望这有帮助。