第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Java:在列表中使用反射或存儲(chǔ)實(shí)例對(duì)象?

Java:在列表中使用反射或存儲(chǔ)實(shí)例對(duì)象?

holdtom 2023-03-17 15:08:52
你好嗎?我正在嘗試執(zhí)行一些動(dòng)態(tài)方法調(diào)用以獲取 Java (Android) 中各種對(duì)象的 sql 字符串,但我對(duì)性能和穩(wěn)定性有一些疑問。上下文示例:存儲(chǔ)庫類 onCreate 方法獲取所有實(shí)體對(duì)象(表)并調(diào)用方法(例如 getCreateTable)以獲取要執(zhí)行的 sql 字符串。當(dāng)然,我可以逐個(gè)類顯式調(diào)用每個(gè)方法,但我還有其他調(diào)用,如“dropTables”、“truncateTables”等,我不想一直重復(fù)相同的結(jié)構(gòu)。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());}直到現(xiàn)在我知道我可以通過 3 種不同的方式做到這一點(diǎn)。1)使用反射(目前正在使用):基本上,我將所有對(duì)象類存儲(chǔ)在一個(gè)列表中,然后使用反射來調(diào)用所需的靜態(tài)方法。但我知道反射并不總是應(yīng)該是首選。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)在列表中存儲(chǔ)對(duì)象實(shí)例:我可以有一個(gè)包含實(shí)例化對(duì)象的列表,然后轉(zhuǎn)換為抽象父類(或接口)并調(diào)用方法來獲取 sql 字符串。在這種情況下,我不知道在內(nèi)存中保留實(shí)例對(duì)象列表是否是一個(gè)好習(xí)慣,也許這可能比根據(jù)列表大小使用反射更糟糕。3) 將所有字符串存儲(chǔ)到 JSON 對(duì)象中:我還沒有測試過那個(gè),但我確定應(yīng)該可以。我可以調(diào)用“init”方法來遍歷所有對(duì)象并使用所有 sql 字符串(刪除、創(chuàng)建、截?cái)嗟龋﹦?chuàng)建該 JSON 對(duì)象/數(shù)組。如果您能與我分享您對(duì)這些方法(優(yōu)缺點(diǎn))或其他更好解決方案的看法,我將不勝感激。
查看完整描述

1 回答

?
30秒到達(dá)戰(zhàn)場

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊

正如評(píng)論中所指出的,這顯然是一個(gè)糟糕的設(shè)計(jì)(這是一個(gè)我正在重構(gòu)的舊項(xiàng)目)。所以我決定擺脫反思,花一些時(shí)間重新設(shè)計(jì)代碼本身。

我創(chuàng)建了一個(gè)基超類來處理所有類似的方法,并讓實(shí)體/模型僅實(shí)現(xiàn)所需的單獨(dú)規(guī)則,因此數(shù)據(jù)庫訪問僅作為單例存儲(chǔ)在一個(gè)類中。使用接口多態(tài)性要好得多。

通過這種方式,db 類處理動(dòng)態(tài) SQL 生成以避免在各處重復(fù)相同的代碼并重新使用/回收實(shí)例列表以提高性能。

觀察。1:反射會(huì)降低性能,通常會(huì)讓調(diào)試變得更加困難。當(dāng)然它可以節(jié)省一些時(shí)間,因?yàn)樗鼘?shí)現(xiàn)起來很快,但是會(huì)禁用大部分 IDE 功能,這使得它在大多數(shù)情況下毫無價(jià)值。

觀察。2:也不應(yīng)該保持?jǐn)?shù)據(jù)庫實(shí)例列表處于活動(dòng)狀態(tài)。讓許多實(shí)例同時(shí)訪問數(shù)據(jù)庫絕不是一個(gè)好主意,它會(huì)導(dǎo)致數(shù)據(jù)庫鎖定并重現(xiàn)意外問題。

觀察。3:那個(gè) JSON 的東西……算了吧。我很抱歉提出如此丑陋的建議。


查看完整回答
反對(duì) 回復(fù) 2023-03-17
  • 1 回答
  • 0 關(guān)注
  • 121 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)