我有一个界面:
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
}
}
});
任何想法如何将其添加到逻辑中而不传递每个实现并手动将相同的检查添加到所有实现?
答案 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,实现此目的的一种方法 -
使用抽象方法创建AbstractListener
类
eventEnd
和callMyExtraMethod
以及模板方法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();
希望这有帮助。