我有發送到DAO(數據訪問對象)的DTO(數據傳輸對象)。使用枚舉或反射的恆定特定方法?需要調用基於字符串的方法
DTO有一個標識符字符串。
基於這個字符串(或者說DTO),我想調用DAO中的特定方法。
這些方法進行數據庫調用。
我發現兩個選項來做到這一點:使用枚舉 2.調用基於反射的方法(在這種情況下,DTO將攜帶需要被調用的方法的名稱 1.恆具體的方法實現。 )
我想知道哪個是更好的選擇。還有其他的選擇嗎?在Enum中進行數據庫調用可以嗎?
使用的編程語言是Java。
我有發送到DAO(數據訪問對象)的DTO(數據傳輸對象)。使用枚舉或反射的恆定特定方法?需要調用基於字符串的方法
DTO有一個標識符字符串。
基於這個字符串(或者說DTO),我想調用DAO中的特定方法。
這些方法進行數據庫調用。
我發現兩個選項來做到這一點:使用枚舉 2.調用基於反射的方法(在這種情況下,DTO將攜帶需要被調用的方法的名稱 1.恆具體的方法實現。 )
我想知道哪個是更好的選擇。還有其他的選擇嗎?在Enum中進行數據庫調用可以嗎?
使用的編程語言是Java。
我不會把數據庫調用放在你的Enum中。相反,請在您的DAO上提供一個接受DTO的方法,然後讓該方法根據DTO上的字符串調用DAO中的其他方法。你可以在Enum上使用switch語句,並使其非常高效。 (或者,把這個實現放在一個單獨的「適配器」類中,因爲可以認爲這個代碼並不嚴格屬於DAO)
我也會避免反射,主要是由於額外的複雜性 - 包括調試和故障排除,以及潛在的安全問題。 (如果字符串包含什麼,你不想叫方法名?)
您可以創建一個映射的字符串映射到方法調用:
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()
的密鑰類型的具體行動。
這對我來說似乎是個好主意。非常感謝您的快速回復。看到每個選項的其他答案,優點和缺點會很有趣。我不是反思的忠實粉絲,除非絕對必要,否則我會盡量避免。 – Vinay 2012-01-15 02:51:41
感謝您的回覆。你能否詳細說明兩件事情:1)「讓該方法根據DTO上的字符串調用DAO中的其他方法」如何實現這一目標? 2)我有興趣知道爲什麼你認爲把數據庫調用放在枚舉中不是個好主意。 – Vinay 2012-01-15 02:53:19
對於Buc的答案+1的關於如何實現動態調用DAO中的方法的示例。另一方面,儘管技術上沒有什麼東西可以相信這一點 - 並且存在爭議,但至少我的觀點是,枚舉應該用作標識符 - 而不包含執行操作。 (當然有些情況下,在Enums中有其他方法是適當的,但這些方法通常用於Enum本身每個值的元數據目的。) – ziesemer 2012-01-15 03:06:07
非常感謝您的意見。我幾乎相信與Buc的建議一致。 – Vinay 2012-01-15 03:09:36