2012-11-03 34 views
0

Java新手在這裏。以下是我想要做的:在實例化它們之前檢查子類的相關性?

  1. 枚舉類的列表,每個類都擴展相同的超類。
  2. 詢問班級是否對某個活動感興趣。
  3. 如果該類感興趣,請實例化該類並調用該對象的事件處理程序。

這個想法是,步驟2和3將阻止不感興趣的類的實例化。但是,因爲我在實例化之前調用方法,所以檢查必須靜態完成。爪哇(正確地)不允許的靜態方法壓倒一切,這樣看來,我必須初始化步驟2中的類,使順序是這樣的:

  1. 枚舉類的列表,每個它擴展了同一個超類。
  2. 實例化每個類並詢問對象是否對事件感興趣。
  3. 如果對象感興趣,請調用它的事件處理程序。如果它不感興趣,把它扔掉。

我是否錯過了完成第一組步驟的一般方法?

請注意,這個問題大多是理論上的。對象創建開銷可能會低到足以使其無法實現。不過,我對這種可能性感興趣。

+0

這類聲音就像一個番石榴['EventBus'](https://code.google.com/p/guava-libraries/wiki/EventBusExplained),除了實例部分。 –

回答

1

由於我們在談論理論,所以我指出了一些事實,並從設計角度講。

靜態方法沒有關聯到某個類的特定實例,因此重寫不是一個選項,因爲它取決於具有一個實例。我在談論Java,因爲我記得一些允許使用類方法重寫的其他語言。

的解決方法,這是在返回它感興趣的事件,每個子類定義一個靜態方法,這樣你就可以知道實例在此之前的數據。

另一種選擇是把一個特定的類負責這些對象實例化,使該類保持表的事件與相關類(表,你可以初始化和配置)的列表關聯。這種方法似乎更易於維護,因爲如果要從事件中取消類別,則不必更改代碼。

最後,你只需實例化綜合類再關聯到某個事件的所有類:

public class EventClassCreator { 
    private Map<String, List<String>> subscriptions; 

    public EventClassCreator() { 
     subscriptions = new HashMap<String,Set<String>>(); 
    } 

    public void addSubscription(String event, String class) { 
     if(subscriptions.containsKey(event)) 
      subscriptions.get(event).add(class); 
     else { 
      Set<String> subscriptionsForEvent = new HashSet<String>(); 
      subscriptionsForEvent.add(class); 
      subscriptions.put(event, subscriptionsForEvent); 
     } 
    } 

    //You just need to make an event that loops over the list of classes, 
    //checks a subscription and instantiates a class if it is in the 
    //proper list. 
} 
+0

好主意。謝謝。 (看起來我必須學習一些關於反思的知識來嘗試第一個想法 - 我需要它來獲得靜態方法。) – Tony

相關問題