ฉันเชื่อว่าอย่างน้อยก็บางส่วนเพื่อให้คุณสามารถรวมcontainsKey
และget
เป็นสายเดียว หากแผนที่สามารถเก็บget
ค่า Null ได้จะไม่มีวิธีบอกได้ว่าคืนค่า Null เนื่องจากไม่มีรหัสสำหรับค่านั้นหรือเพียงเพราะค่าเป็น Null
ทำไมเป็นปัญหา เพราะไม่มีวิธีที่ปลอดภัยที่จะทำด้วยตัวเอง ใช้รหัสต่อไปนี้:
if (m.containsKey(k)) {
return m.get(k);
} else {
throw new KeyNotPresentException();
}
เนื่องจากm
เป็นแผนที่ที่เกิดขึ้นพร้อมกันคีย์ k อาจถูกลบระหว่างcontainsKey
และการget
โทรทำให้ตัวอย่างข้อมูลนี้ส่งคืนค่า null ที่ไม่เคยอยู่ในตารางแทนที่จะเป็นที่ต้องการKeyNotPresentException
ที่ไม่เคยอยู่ในตารางมากกว่าที่ต้องการ
โดยปกติคุณจะแก้ปัญหาด้วยการซิงโครไนซ์ แต่ด้วยแผนที่พร้อมกันซึ่งแน่นอนว่าจะไม่ทำงาน ดังนั้นลายเซ็นสำหรับget
ต้องมีการเปลี่ยนแปลงและวิธีเดียวที่จะทำในวิธีที่เข้ากันได้แบบย้อนหลังคือการป้องกันไม่ให้ผู้ใช้ใส่ค่า Null ในตอนแรกและดำเนินการต่อเพื่อใช้เป็นตัวยึดสำหรับ "ไม่พบคีย์"