2012-01-15 29 views
2

我有發送到DAO(數據訪問對象)的DTO(數據傳輸對象)。使用枚舉或反射的恆定特定方法?需要調用基於字符串的方法

DTO有一個標識符字符串。

基於這個字符串(或者說DTO),我想調用DAO中的特定方法。

這些方法進行數據庫調用。

我發現兩個選項來做到這一點:使用枚舉 2.調用基於反射的方法(在這種情況下,DTO將攜帶需要被調用的方法的名稱 1.恆具體的方法實現。 )

我想知道哪個是更好的選擇。還有其他的選擇嗎?在Enum中進行數據庫調用可以嗎?

使用的編程語言是Java。

回答

1

我不會把數據庫調用放在你的Enum中。相反,請在您的DAO上提供一個接受DTO的方法,然後讓該方法根據DTO上的字符串調用DAO中的其他方法。你可以在Enum上使用switch語句,並使其非常高效。 (或者,把這個實現放在一個單獨的「適配器」類中,因爲可以認爲這個代碼並不嚴格屬於DAO)

我也會避免反射,主要是由於額外的複雜性 - 包括調試和故障排除,以及潛在的安全問題。 (如果字符串包含什麼,你不想叫方法名?)

+0

感謝您的回覆。你能否詳細說明兩件事情:1)「讓該方法根據DTO上的字符串調用DAO中的其他方法」如何實現這一目標? 2)我有興趣知道爲什麼你認爲把數據庫調用放在枚舉中不是個好主意。 – Vinay 2012-01-15 02:53:19

+0

對於Buc的答案+1的關於如何實現動態調用DAO中的方法的示例。另一方面,儘管技術上沒有什麼東西可以相信這一點 - 並且存在爭議,但至少我的觀點是,枚舉應該用作標識符 - 而不包含執行操作。 (當然有些情況下,在Enums中有其他方法是適當的,但這些方法通常用於Enum本身每個值的元數據目的。) – ziesemer 2012-01-15 03:06:07

+0

非常感謝您的意見。我幾乎相信與Buc的建議一致。 – Vinay 2012-01-15 03:09:36

1

您可以創建一個映射的字符串映射到方法調用:

class YourDAO { 

    private interface Action { 
     public void perform(); 
    } 

    private Map<String, Action> actions; 

    public YourDAO() { 
     actions.add("String1", new Action() { 
      public void perform() { 
       daoMethod1(); 
      } 
     } 
     actions.add("String2", new Action() { 
      public void perform() { 
       daoMethod2(); 
      } 
     } 
    } 

    public void daoMethod1() { 
     ... 
    } 

    public void daoMethod2() { 
     ... 
    } 

    public void doSomethingWithDTO(YourDTO dto) { 
     actions.get(dto.getIdentifier()).perform(); 
    } 

} 

你甚至可以適應這樣的想法來執行如果您將 更改爲Class<?>而不是dto.getIdentifier()使用dto.getClass()的密鑰類型的具體行動。

+0

這對我來說似乎是個好主意。非常感謝您的快速回復。看到每個選項的其他答案,優點和缺點會很有趣。我不是反思的忠實粉絲,除非絕對必要,否則我會盡量避免。 – Vinay 2012-01-15 02:51:41