Saya berasumsi OP berarti "Mengapa Java tidak mendukung objek n-tuple?". Python, Haskell, Lisp, ML dll memiliki kemampuan n-tuple yang heterogen. Seringkali juga kemampuan untuk mengembalikan beberapa objek dalam suatu bahasa adalah gula sintaksis (yaitu dalam python return 'a','b').
Alasannya tentu saja adalah desain dan konsistensi bahasa. Java lebih suka bersikap sangat eksplisit dan tidak menyukai struktur data anonim (walaupun saya berharap kami memiliki penutupan anonim).
Misalnya di Java tidak ada cara untuk mengatakan saya ingin panggilan balik yang mengambil parameter tipe ini dan mengembalikannya. Beberapa orang merasakan ini sebagai kelemahan besar, sementara yang lain menyukai konsistensi dan kejelasan.
IMHO meskipun menjengkelkan, saya sering mengatasi masalah ini dengan membuat kelas inline statis:
private static class Combo {
String name;
int weight;
}
Ya, itu membosankan tetapi kemudian saya sering menggunakan kembali dan memfaktorkan ulang kelas-kelas tersebut sehingga menjadikannya tingkat atas dan menambahkan perilaku. Faktanya, salah satu keuntungan menggunakan rute ini adalah lebih mudah untuk menambahkan bidang baru di mana struktur data anonim (seperti dalam bahasa FP) menjadi jauh lebih sulit untuk menambahkan bidang (Anda akhirnya mengubah banyak kode).
Saya harus mencatat bahwa untuk 2-tupel beberapa orang menggunakan (atau menyalahgunakan) java.util.Map.Entry
karena ada java.util.AbstractMap.SimpleEntry
di Java 6. Juga Beberapa orang sekarang menggunakan Dukungan Pasangan Commons Lang3 (2-tuple).
Scala memiliki dukungan n-tuple dengan semacam kecurangan dan memiliki sejumlah 2-16 antarmuka tupel yang standar dalam bahasa tersebut dan secara sintaksis tersembunyi dari pemrogram.
Untuk alasan pendidikan semata, Anda mungkin ingin melihat bagaimana bahasa lain mencapai hal ini.
PEMBARUAN: untuk Java 8
Java 8 akan/mungkin (jadi ini nomor saya... hubungi saya mungkin) mendukung antarmuka bernama java.lang.BiValue
dengan implementasi konkret yang dapat Anda gunakan disebut java.lang.BiVal
. Kelas-kelas ini untuk membantu mendukung fungsionalitas lambda baru. Namun perhatikan ini hanya untuk 2 tupel.
PEMBARUAN: untuk tahun 2015
Java 8 tidak mendapatkan dukungan untuk tupel.
PEMBARUAN: dari penulis 2015
Jika Anda masih menginginkan dukungan tupel, ada tiga perpustakaan yang mendukung tupel dengan baik:
- javatuples - Mendukung JDK 5 ke atas. Hingga 10 tupel.
- JOOλ - Dari penulis jOOQ tetapi membutuhkan JDK 8.
- Commons Lang 3 - Sekarang mendukung Triple (3-tuple) dan mendukung JDK 6 dan di atas.
person
Adam Gent
schedule
19.09.2011