ฉันถือว่า OP หมายถึง "เหตุใด Java จึงไม่รองรับวัตถุ n-tuple" Python, Haskell, Lisp, ML ฯลฯ มีความสามารถ n-tuple ที่ต่างกัน บ่อยครั้งที่ความสามารถในการส่งคืนอ็อบเจ็กต์หลายรายการในภาษาหนึ่ง ๆ นั้นเป็นน้ำตาลเชิงวากยสัมพันธ์ (เช่นใน python return 'a', 'b')
เหตุผลก็คือการออกแบบภาษาและความสม่ำเสมอ Java ชอบความชัดเจนมากและไม่ชอบโครงสร้างข้อมูลที่ไม่เปิดเผยตัวตน (แม้ว่าฉันหวังว่าเราจะมีการปิดแบบไม่ระบุชื่อก็ตาม)
ตัวอย่างเช่นใน Java ไม่มีทางที่จะบอกว่าฉันต้องการให้โทรกลับที่รับพารามิเตอร์ประเภทเหล่านี้และส่งคืนสิ่งนี้ บางคนรู้สึกว่านี่เป็นจุดอ่อนอย่างมาก ส่วนคนอื่นๆ ชอบความสม่ำเสมอและความชัดเจน
IMHO แม้ว่ามันจะน่ารำคาญ แต่ฉันมักจะต่อสู้กับปัญหานี้ด้วยการสร้างคลาสอินไลน์แบบคงที่:
private static class Combo {
String name;
int weight;
}
ใช่ มันน่าเบื่อ แต่หลังจากนั้นฉันมักจะนำมาใช้ซ้ำและปรับโครงสร้างคลาสเหล่านั้นใหม่ ทำให้คลาสเหล่านั้นอยู่ในระดับสูงสุดและเพิ่มพฤติกรรม ข้อดีอย่างหนึ่งของการไปในเส้นทางนี้คือ การเพิ่มฟิลด์ใหม่ง่ายกว่ามาก โดยที่โครงสร้างข้อมูลที่ไม่ระบุชื่อ (เช่นในภาษา FP) ทำให้การเพิ่มฟิลด์ยากขึ้นมาก (ท้ายที่สุดคุณต้องเปลี่ยนโค้ดจำนวนมาก)
ฉันควรทราบว่าสำหรับ 2-tuples บางคนใช้ (หรือใช้ในทางที่ผิด) java.util.Map.Entry
เนื่องจากมี java.util.AbstractMap.SimpleEntry
ใน Java 6 นอกจากนี้ บางคนยังใช้ การสนับสนุนการจับคู่ของ Commons Lang3 (2-tuple)
Scala มีการสนับสนุน n-tuple โดยการเรียงลำดับของการโกงและมีอินเทอร์เฟซ tuple 2-16 ชุดที่เป็นมาตรฐานในภาษาและถูกซ่อนทางวากยสัมพันธ์จากโปรแกรมเมอร์
ด้วยเหตุผลด้านการศึกษาเพียงอย่างเดียว คุณอาจต้องการดูว่า ภาษาอื่นๆ บรรลุเป้าหมายนี้ได้อย่างไร
อัปเดต: สำหรับ Java 8
Java 8 จะ/อาจจะ (ดังนั้นนี่คือหมายเลขของฉัน... โทรหาฉันหน่อยสิ) รองรับอินเทอร์เฟซที่เรียกว่า java.lang.BiValue
ด้วยการใช้งานที่เป็นรูปธรรมที่คุณสามารถใช้ได้ที่เรียกว่า java.lang.BiVal
คลาสเหล่านี้มีไว้เพื่อช่วยสนับสนุนฟังก์ชันแลมบ์ดาใหม่ แต่สังเกตว่านี่เป็นเพียงสิ่งอันดับ 2 เท่านั้น
อัปเดต: สำหรับปี 2015
Java 8 ไม่ ได้รับการสนับสนุนสำหรับสิ่งอันดับ
อัปเดต: จากผู้เขียนปี 2015
หากคุณยังคงต้องการการสนับสนุน tuple มีไลบรารีสามแห่งที่รองรับ tuple ได้ดี:
- javatuples - รองรับ JDK 5 ขึ้นไป มากถึง 10 สิ่ง
- JOOλ - จากผู้เขียน jOOQ แต่ต้องใช้ JDK 8
- Commons Lang 3 - ขณะนี้รองรับ Triple (3-tuple) และรองรับ JDK 6 และ ข้างบน.
person
Adam Gent
schedule
19.09.2011