[英]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.