【发布时间】:2017-02-04 06:46:59
【问题描述】:
我的课程最初从几个单独的 addAListener() addBListener() 和 removeAListener 等开始。这对一个课程来说还不错,但是当该课程被另一个课程在内部使用并且扩展的听众得到传播出去。
一个简单的解决方案是使用单个接口并使用instanceof 来整理监听器:
public interface Listener {
}
public class ListenerA extends Listener {
}
public class ListenerB extends Listener {
}
public class ListenerC extends Listener {
}
List<ListenerA> ofListenersA = new List<>();
List<ListenerB> ofListenersB = new List<>();
List<ListenerC> ofListenersC = new List<>();
void addListener(Listener listener) {
if (listener instanceof ListenerA) {
ofListenersA.add(listener);
return;
}
if (listener instanceof ListenerB) {
ofListenersB.add(listener);
return;
}
if (listener instanceof ListenerB) {
ofListenersB.add(listener);
return;
}
}
void removeListener(Listener listener) {
if (listener instanceof ListenerA) {
ofListenersA.remove(listener);
return;
}
if (listener instanceof ListenerB) {
ofListenersB.remove(listener);
return;
}
if (listener instanceof ListenerB) {
ofListenersB.remove(listener);
return;
}
}
但现在我必须专门评估每个 instanceof,因为你不能在课堂上 switch。
这不是要求优化的尝试,因为我没有多种侦听器需要检查;而是一个问题,当涉及到面向对象的设计时,这是否是一种糟糕的方法。
更新
在接口中使用枚举的短路方法:
enum ListenerType {
ListenerTypeA,
ListenerTypeB,
ListenerTypeC
}
public interface Listener {
ListenerType getType();
}
public class ListenerA extends Listener {
ListenerType getType() {
return ListenerType.ListenerTypeA;
}
}
public class ListenerB extends Listener {
ListenerType getType() {
return ListenerType.ListenerTypeB;
}
}
public class ListenerC extends Listener {
ListenerType getType() {
return ListenerType.ListenerTypeC;
}
}
List<ListenerA> ofListenersA = new List<>();
List<ListenerB> ofListenersB = new List<>();
List<ListenerC> ofListenersC = new List<>();
void addListener(Listener listener) {
switch (listener) {
case ListenerTypeA: {
ofListenersA.add(listener);
return;
}
case ListenerTypeB: {
ofListenersB.add(listener);
return;
}
case ListenerTypeC: {
ofListenersC.add(listener);
return;
}
}
}
void removeListener(Listener listener) {
switch (listener) {
case ListenerTypeA: {
ofListenersA.remove(listener);
return;
}
case ListenerTypeB: {
ofListenersB.remove(listener);
return;
}
case ListenerTypeC: {
ofListenersC.remove(listener);
return;
}
}
}
【问题讨论】:
-
如果您使用的是
instanceof,那么您的设计可能是错误的。为什么要单独跟踪所有这些侦听器,如果需要将它们分开,为什么要使用单个addListener方法? -
因为我有其他对象使用此类的对象作为私有成员。因此,当我想从上面提供侦听器时,我必须再次为该类重新实现每个添加/删除侦听器。我将它们都作为单独的侦听器的原因是因为我为不同的事件单独循环它们中的每一个。
-
我查看了很多开源项目,但我不记得有谁使用单一方法作为通用侦听器,通常:您可能希望为每个侦听器创建一个方法并添加一些直观的名称。跨度>
-
@Zhro A
class不能扩展interface。 #justsaying。 -
@Zhro,你可以有一个接口,在它的抽象方法中你可以有一个定义事件类型的变量(变量可以是枚举类型)。现在是单一接口和单一方法。您还需要单个侦听器数组。另一种方法是基于事件类型的单个接口,其中包含各种方法。只要注意你最终不会有胖接口。无论如何,太多分散的代码也不好。请参阅下面我的回答。希望它会是hepful
标签: java oop switch-statement instanceof