你好嗎?我正在嘗試執行一些動態方法調用以獲取 Java (Android) 中各種對象的 sql 字符串,但我對性能和穩定性有一些疑問。上下文示例:存儲庫類 onCreate 方法獲取所有實體對象(表)并調用方法(例如 getCreateTable)以獲取要執行的 sql 字符串。當然,我可以逐個類顯式調用每個方法,但我還有其他調用,如“dropTables”、“truncateTables”等,我不想一直重復相同的結構。public void CreateTables() { execute(Entity1.getCreateTable()); execute(Entity2.getCreateTable()); execute(Entity3.getCreateTable()); [..] execute(Entity50.getCreateTable());}public void DropTables() { execute(Entity1.getDropTable()); execute(Entity2.getDropTable()); execute(Entity3.getDropTable()); [..] execute(Entity50.getDropTable());}直到現在我知道我可以通過 3 種不同的方式做到這一點。1)使用反射(目前正在使用):基本上,我將所有對象類存儲在一個列表中,然后使用反射來調用所需的靜態方法。但我知道反射并不總是應該是首選。private final List<Class> entityList = new ArrayList<Class>() { { add(Entity1.class); add(Entity2.class); add(Entity3.class); }};public void createTables() { /* get all query strings */ List<String> queryList = getQueryList("createTable"); try { for (String query : queryList) { execute(query); } } catch (SQLException e) { [...] }}private List<String> getQueryList(String methodName) { List<String> queryList = new ArrayList<>(); for (Class<?> objectClass : entityList) { try { Method[] ms = objectClass.getMethods(); for (Method me : ms) { if (me.getName().equals(methodName)) { String query = (String) me.invoke(null); if (query != null && query.length() > 0) { queryList.add((String) me.invoke(null)); } break; } } } catch (Exception e) { [...] } } return queryList;}2)在列表中存儲對象實例:我可以有一個包含實例化對象的列表,然后轉換為抽象父類(或接口)并調用方法來獲取 sql 字符串。在這種情況下,我不知道在內存中保留實例對象列表是否是一個好習慣,也許這可能比根據列表大小使用反射更糟糕。3) 將所有字符串存儲到 JSON 對象中:我還沒有測試過那個,但我確定應該可以。我可以調用“init”方法來遍歷所有對象并使用所有 sql 字符串(刪除、創建、截斷等)創建該 JSON 對象/數組。如果您能與我分享您對這些方法(優缺點)或其他更好解決方案的看法,我將不勝感激。
1 回答

30秒到達戰場
TA貢獻1828條經驗 獲得超6個贊
正如評論中所指出的,這顯然是一個糟糕的設計(這是一個我正在重構的舊項目)。所以我決定擺脫反思,花一些時間重新設計代碼本身。
我創建了一個基超類來處理所有類似的方法,并讓實體/模型僅實現所需的單獨規則,因此數據庫訪問僅作為單例存儲在一個類中。使用接口多態性要好得多。
通過這種方式,db 類處理動態 SQL 生成以避免在各處重復相同的代碼并重新使用/回收實例列表以提高性能。
觀察。1:反射會降低性能,通常會讓調試變得更加困難。當然它可以節省一些時間,因為它實現起來很快,但是會禁用大部分 IDE 功能,這使得它在大多數情況下毫無價值。
觀察。2:也不應該保持數據庫實例列表處于活動狀態。讓許多實例同時訪問數據庫絕不是一個好主意,它會導致數據庫鎖定并重現意外問題。
觀察。3:那個 JSON 的東西……算了吧。我很抱歉提出如此丑陋的建議。
添加回答
舉報
0/150
提交
取消