2012-11-25 20 views
1

我不確定把這個問題稱爲什麼,所以其他人可能會使用它,但我有一個來自我的老師的多態性的簡單例子,我試圖修改abit。安全多態實踐?

但我不確定我的修改是否「安全」。

public class AppSystem { 
    ... 
    private DataPersistenceInterface DataDAO; 
    private DataController DataController; 
    ... 

    public void createConnection(String username, String password) 
           throws ClassNotFoundException, SQLException { 

     if(username.isEmpty() || password.isEmpty()) { 
      DataDAO = new DataDAO(); 
      DataController = new DataController(DataDAO); 
     } else { 
      DataDAO = new DataDAO(url, username, password, driver); 
      DataController = new DataController(DataDAO); 
     } 
     } 

    public void closeConnection() { 
     DataDAO.closeConnection(); 
    } 

我們有一個控制器和一個DAO。 DAO實現了一個名爲DataPersistenceInterface的接口,該接口承載了一些與數據庫進行通信所需的方法。由於數據控制器處理所有邏輯,並且我們不希望它知道其他任何內容,所以我們將它傳遞給接口類型中的DAO引用。

這是我的老師做的。然而,下面的方法「closeConnection」不會因此而起作用,因爲對DataDAO的引用並不指向DAO類中的任何「closeConnection」方法...

[closeConnection方法在上面不起作用代碼,顯然]

現在,我的想法是,只要改變......

private DataPersistenceInterface DataDAO; 

private DataDAO DataDAO; 

由於datacontroller在其構造函數中接受DataPersistenceInterface的參數,因此它不會從DAO對象知道其他任何內容。現在我可以在DAO上調用closeConnection了。

但我不確定這是「安全」嗎?有些東西告訴我它不是。

謝謝你的時間。

回答

0

首先,代碼清晰,而不是寫

private DataPersistenceInterface DataDAO; 

寫:

private DataPersistenceInterface dataPersistenceInterface; 

始終使用駱駝情況下的Java性能,並與正在使用的類相同的名稱。一個最好的初步實踐也將是命名接口的實現相同的名稱加上默認地將Impl:

DataPersistenceInterfaceImpl 

這是一個模式的問題,如果你想創建一個使用刀的構造連接,您有三個選擇:

1)您可以通過將其添加到界面簽名添加closeConnection方法將DataPersistenceInterface接口:

public void closeConnection(); 

2)但是因爲AppSystem類不知道它使用了實施創建DataPersistenceIn terface(DataDao),你可以將接口轉換回實現。你會有你的closeConnection()回來。這將是我最好的客人。

public void closeConnection() { 
     ((DataDAO)dataPersistenceInterface).closeConnection(); 
    } 

3)根據您的AppSys的使用情況,不要關心關閉連接。將緊密連接方法放在DataDAO實現的finalize()方法中。當AppSys應用程序結束時,連接將關閉。

protected void finalize() throws Throwable { 
try{ 
connection.close; 
}catch(Exception e){ 
... 
} 
} 

最好的實踐是使用ConnectionPool,如c3po或Apache ConnectionPool。

+1

1)完全同意,這樣做! 2)請不要。定義接口並使用通過接口類型聲明的變量來隱藏真正的實現(* polymorphism *)是一種常見的做法。如果你想切換到另一個實現,那麼繼續,如果你使用實現類型,你必須改變每種用法的類型。 3)不要這樣做。你可以使用try-catch-finally塊,但是不能保證finalize方法的執行,並且有幾種情況報告其行爲方式與預期不同。 – Andy

+0

是的,我同意你所有的評論......說「取決於用法」,我的意思是如果你爲老師做了一個Hello World,但你是對的...... – etienno