簡體   English   中英

仔細檢查是否存在地圖元素?

[英]Double checking for existence a map element?

在我現在正在使用的代碼中,我遇到了以下內容:

PartnerReportItem item = (map.get(partnerId) == null) ? null
    : map.get(partnerId).get(platform); //1, check for existence

if (item == null) {
    item = new PartnerReportItem();
    item.setPlatform(platform);
    item.setPartnerId(partnerId);
    item.setPartnerEmail(partner.getEmail());
    item.setPartnerPaymentDetails(paymentDetails);
    item.setPartnerCoef(partner.getCoef());
    item.setExchangeMap(exchangeMap);

    if (!map.containsKey(partnerId)) //2, double check for existence??
        map.put(partnerId, new HashMap<Platform, PartnerReportItem>());
    map.get(partnerId).put(platform, item);
}

我對//1//2感到困惑,因為我認為// 2在這里是不必要的。 我們已經檢查了地圖中是否存在帶有partnerId的元素。 我可以不隱藏一個主意嗎?

該項目可能為null,因為map.get不返回任何內容(外部映射不存在)或內部映射不包含所請求的對象。 因此,執行第二次檢查以檢測實際原因item變為空。

您似乎在地圖中有一張地圖。

PartnerReportItem item = (map.get(partnerId) == null) ? null : map.get(partnerId).get(platform);

如果item不為null,則表示在外部地圖中找到partnerId ,在內部地圖中找到platform

但是,如果item為null,則外部映射中仍可能存在partnerId鍵,這意味着在必要時進行containsKey檢查。

如其他答案所述,您需要保留此檢查。 但是,實際上這是一個不好的編碼,因為有多個原因與PartnerReportItem實例為null無關(因此,第一個if語句中的第二次檢查)無關。

您最好將其拆分以使意圖更清晰(並避免在其他人閱讀您的代碼時造成混淆)。

Map<Platform, PartnerReportItem> innerMap = map.get(partnerId);
if(innerMap == null) {
    innerMap = new HashMap<Platform, PartnerReportItem>();
    innerMap.put(partnerId, createPartnerReportItem(...));
} else {
    PartnerReportItem item = innerMap.get(partnerId);
    if(item == null) {
        innerMap.put(partnerId, createPartnerReportItem(...));
    }
}

或其他變體:

Map<Platform, PartnerReportItem> innerMap = map.get(partnerId);
if(innerMap == null) {
    innerMap = new HashMap<Platform, PartnerReportItem>();
}
PartnerReportItem item = innerMap.get(partnerId);
if(item == null) {
    innerMap.put(partnerId, createPartnerReportItem(...));
}

關鍵是,編寫此三元嵌套語句的程序員雖然會減少代碼的編寫,但是最后您會發現它只是令人困惑。 始終編​​寫可讀代碼!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM