如何解决使用不同参数的事件通知的最佳模式是什么?
我正在寻找一种替代方法(方法1):
public interface IEventListener {
void onFoo(String string,Integer integer,ObjectB objectB);
void onBar(Double d,ObjectA objectA);
}
我在想类似的方法(方法2):
public interface IEventListener {
void onEvent(Event event);
}
public enum EVENT_TYPE {
FOO,BAR
}
public abstract class Event {
EVENT_TYPE type;
abstract EVENT_TYPE getType();
}
public class FooEvent extends Event {
private String string;
private Integer integer;
private ObjectB objectB;
@Override
EVENT_TYPE getType() {
return EVENT_TYPE.FOO;
}
}
public class BarEvent extends Event {
private Double d;
private ObjectA objectA;
@Override
EVENT_TYPE getType() {
return EVENT_TYPE.BAR;
}
}
但是我不确定它的易用性。 要处理事件,我需要检查事件类型并将事件转换为正确的事件,等等。
也许方法1别无选择?
解决方法
远离共同祖先,直到您有明确的理由来处理抽象事件(例如某些日志记录,计时,队列,序列化等)为止。
将侦听器编码为lambda更为简单。您最好考虑一下监听器的类,例如Consumer
事件提供者将实现类似
addFooListener(Consumer
处理程序可能有 公共无效handleFoo(Foo foo){...}
,安装代码将初始化 provider.addFooListener(somehandler :: handleFoo);
,我有时使用的一种模式是使侦听器方法为空的默认方法,然后在可以使用lambda创建的功能接口子类型中覆盖它们中的每一个,如下所示:
public interface IEventListener {
default void onFoo(String string,Integer integer,ObjectB objectB){}
default void onBar(Double d,ObjectA objectA){}
interface OnFoo extends IEventListener {
@Override void onFoo(String string,ObjectB objectB);
}
interface OnBar extends IEventListener {
@Override void onBar(Double d,ObjectA objectA);
}
}
然后,您可以将其与实现了要接收的多种方法的匿名类或仅侦听一个的lambda一起使用:
object.addListener((OnBar)(d,a) -> System.out.println(d));
您仍可以将其与问题中的事件对象(例如FooEvent
)一起使用,如果以后可以更改自变量,则可能是个好主意,因为您可能只需要向{{1}添加字段},而不是重写所有侦听器实现。
FooEvent
我认为这对于以下情况更好:当您有许多侦听器,每个侦听器都需要侦听事件的子集时,但是在我仅需要处理所有事件之前,我还使用了问题中的方法2一个地方。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。