ทีมงาน Java ได้ทำงานอย่างยอดเยี่ยมในการขจัดอุปสรรคในการเขียนโปรแกรมการทำงานใน Java 8 โดยเฉพาะอย่างยิ่งการเปลี่ยนแปลงของ java.util Collections ทำหน้าที่ได้อย่างยอดเยี่ยมในการแปลงสายสัมพันธ์ให้เป็นการดำเนินการที่รวดเร็วมาก เมื่อพิจารณาว่างานที่พวกเขาทำเพิ่มฟังก์ชันชั้นหนึ่งและวิธีการทำงานในคอลเลกชันได้ดีเพียงใดทำไมพวกเขาถึงล้มเหลวในการจัดหาคอลเลกชันที่ไม่เปลี่ยนรูปแบบหรือแม้แต่อินเตอร์เฟสคอลเล็กชันที่ไม่เปลี่ยนรูปแบบโดยสิ้นเชิง
โดยไม่ต้องเปลี่ยนรหัสใด ๆ ที่มีอยู่ทีม Java สามารถเพิ่มอินเทอร์เฟซที่ไม่เปลี่ยนรูปได้ซึ่งเป็นอินเทอร์เฟซที่ไม่เปลี่ยนรูปได้ลบเมธอด "set" และทำให้อินเตอร์เฟสที่มีอยู่ขยายออกจากพวกเขาเช่นนี้
ImmutableIterable
____________/ |
/ |
Iterable ImmutableCollection
| _______/ / \ \___________
| / / \ \
Collection ImmutableList ImmutableSet ImmutableMap ...
\ \ \_________|______________|__________ |
\ \___________|____________ | \ |
\___________ | \ | \ |
List Set Map ...
แน่นอนว่าการทำงานเช่น List.add () และ Map.put () จะส่งคืนบูลีนหรือค่าก่อนหน้าสำหรับคีย์ที่กำหนดเพื่อระบุว่าการดำเนินการสำเร็จหรือล้มเหลว คอลเลกชันที่ไม่เปลี่ยนรูปจะต้องปฏิบัติต่อวิธีการเช่นโรงงานและส่งคืนคอลเลกชันใหม่ที่มีองค์ประกอบที่เพิ่มเข้ามาซึ่งไม่สามารถใช้ได้กับลายเซ็นปัจจุบัน แต่นั่นอาจเป็นการหลีกเลี่ยงปัญหาโดยใช้ชื่อเมธอดอื่นเช่น ImmutableList.append () หรือ .addAt () และ ImmutableMap.putEntry () การใช้คำฟุ่มเฟื่อยที่เกิดขึ้นจะมากกว่าเมื่อเทียบกับผลประโยชน์ของการทำงานกับคอลเลกชันที่ไม่เปลี่ยนรูปแบบและระบบประเภทจะป้องกันข้อผิดพลาดของการโทรวิธีที่ผิด เมื่อเวลาผ่านไปวิธีการเก่าอาจเลิกใช้
ชนะคอลเลกชันที่ไม่เปลี่ยนรูป:
- ความเรียบง่าย - การใช้เหตุผลเกี่ยวกับรหัสนั้นง่ายขึ้นเมื่อข้อมูลพื้นฐานไม่เปลี่ยนแปลง
- เอกสารประกอบ - หากวิธีการใช้อินเทอร์เฟซการรวบรวมที่ไม่เปลี่ยนรูปแบบคุณจะรู้ว่าจะไม่แก้ไขการรวบรวมนั้น หากวิธีการส่งกลับคอลเลกชันที่ไม่เปลี่ยนรูปคุณรู้ว่าคุณไม่สามารถแก้ไขได้
- การเกิดขึ้นพร้อมกัน - คอลเลกชันที่ไม่เปลี่ยนรูปสามารถใช้ร่วมกันได้อย่างปลอดภัยในชุด
ในฐานะที่เป็นคนที่มีภาษาที่ชิมไม่ได้จึงยากที่จะกลับไปที่ Wild West ของการกลายพันธุ์ที่อาละวาด คอลเล็กชันของ Clojure (Abstraction ต่อเนื่อง) มีทุกอย่างที่คอลเลกชัน Java 8 มีให้รวมถึงการเปลี่ยนแปลงไม่ได้ (แม้ว่าอาจจะใช้หน่วยความจำเพิ่มเติมและเวลาเนื่องจากการซิงโครไนซ์เชื่อมโยงรายการแทนที่จะสตรีม) สกาล่ามีทั้งคอลเลคชั่นที่เปลี่ยนแปลงไม่ได้และไม่เปลี่ยนรูปแบบด้วยชุดปฏิบัติการเต็มรูปแบบและแม้ว่าการดำเนินการเหล่านั้นมีความกระตือรือร้นการเรียก .iterator ให้มุมมองที่ขี้เกียจ (และมีวิธีอื่น ๆ ฉันไม่เห็นว่า Java สามารถแข่งขันต่อไปได้อย่างไรหากไม่มีคอลเลกชันที่ไม่เปลี่ยนรูป
ใครสามารถชี้ให้ฉันดูประวัติศาสตร์หรือการสนทนาเกี่ยวกับเรื่องนี้ แน่นอนมันสาธารณะที่ไหนสักแห่ง
const
คอลเล็กชัน
Collections.unmodifiable*()
มีไว้สำหรับ แต่ไม่ถือว่าสิ่งเหล่านี้ไม่เปลี่ยนรูปเมื่อพวกเขาไม่ใช่
ImmutableList
ในแผนภาพนั้นผู้คนสามารถผ่านในรูปแบบที่ไม่แน่นอนได้List
หรือไม่? ไม่นั่นเป็นการละเมิด LSP ที่แย่มาก