2015-06-21 70 views
0

我的問題發送數據到另一個模塊式安全

什麼樣的設計可以讓我有選擇地兩個模塊之間傳遞數據,而不缺乏類型安全的?這樣的事情可能嗎?

說明

我已經從派生的類2個模塊

abstract class Module { 
    public abstract void init(App app); 
    public abstract void exit(App app); 
    public abstract void process(App app); 
    public abstract void paint(Graphics g); 
} 

App類跟蹤哪些模塊是當前模塊,並允許該模塊處理執行:

class App { 
    private Map<Class<? extends Module>, Module> allModules = ...; 
    private Module currentModule; 

    //things to be used in modules 
    private Canvas canvas; 

    protected void start() { 
     allModules.put(FirstModule.class, new FirstModule()); 
     //... 

     currentModule = ...; 
     currentModule.init(this); 
    } 

    protected void process() { 
     currentModule.process(this); 
    } 

    protected void paint(Graphics g) { 
     currentModule.paint(g); 
    } 

    public void switchModule(Class<? extends Module> module) { 
     //perform validation 
     Module next = allModules.get(module); 

     currentModule.exit(this); 
     currentModule = next; 
     next.init(this); 
    } 

    //expose items that modules will use 
    public Canvas getCanvas() { 
     return canvas; 
    } 
} 

現在,第一個模塊負責收集用戶指定的「設置」;他們將顯示覆選框選擇,然後點擊一個按鈕,用於存儲信息有關該複選框被選中:

class First extends Module { 
    private boolean firstBoxChecked, secondBoxChecked, thirdBoxChecked; 

    public void init(App app) { 
     canvas.addMouseListener(...); 
    } 

    public void process(App app) { 
     if(buttonClicked) { 
      app.switchModule(Second.class); 
      //pass data to next module 
     } 
    } 
} 

因此,在一個模塊的執行過程中的某個時刻,它會切換當前模塊。有些時候我想在當前模塊和我切換到的模塊之間傳遞數據(從第一個到第二個)。

我嘗試

唯一的「高效」的辦法,我能想到的是複製Android的交換活動設計(使用類似物體的Intent):

ModuleSwitchAction action = new ModuleSwitchAction(Second.class); 
action.put("firstBoxChecked", "true"); 
//... 
app.switchModule(action); 

的人在其他類需要知道確切的鍵名,如果他們搞砸了,在編譯時沒有任何警告。有沒有更安全的方法來做到這一點?

+0

看起來像你想訪問超類型接口的子類型實現差異。我不確定如果您不使用地圖,您就可以做到這一點。但是,您可以使用枚舉類型實現映射鍵,至少提供一些編譯時類型安全性。 – jrahhali

回答

相關問題