我的課程最初是從幾個單獨的addAListener()
addBListener()
和removeAListener
等開始的。這對一個類沒有那麼糟糕,但當類被另一個類內部使用並且擴展偵聽器被傳播出去時,它真的向外爆發。有沒有更好的方法來短路一個instanceof鏈?
一個簡單的解決方法是使用一個單一的界面,並整理出聽衆與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'方法? – chrylis
因爲我有其他使用這個類的對象作爲私有成員的對象。所以當我想從上面提供監聽器時,我必須爲每個類再次實現每個添加/刪除監聽器。我將它們全部作爲單獨的監聽者的原因是因爲我爲每個事件分別循環了每個事件。 – Zhro
我已經查看了許多開源項目,但我不記得任何使用單一方法的通用監聽器,你經常會想:爲每個監聽器創建一個方法並添加一些直觀的名稱。 – Enzokie