Jawaban singkat untuk "mengapa tidak Cloneable
usang?" (atau memang, mengapa tidak X
usang, untuk semua X
) adalah bahwa tidak ada banyak perhatian yang dibayarkan untuk mencela mereka.
Sebagian besar hal yang telah ditinggalkan baru-baru ini sudah usang karena ada rencana khusus untuk menghapusnya. Sebagai contoh, addPropertyChangeListener
dan removePropertyChangeListener
metode LogManager sudah tidak digunakan lagi di Java SE 8 dengan maksud untuk menghapusnya di Java SE 9. (Alasannya adalah mereka tidak perlu memperumit saling ketergantungan modul.) Memang, API ini telah dihapus dari pengembangan JDK 9 awal. membangun. (Perhatikan bahwa panggilan pendengar perubahan properti serupa juga dihapus dari Pack200
; lihat JDK-8029806 .)
Tidak ada rencana serupa untuk Cloneable
danObject.clone()
.
Jawaban yang lebih panjang akan melibatkan diskusi pertanyaan lebih lanjut, seperti apa yang mungkin diharapkan terjadi pada API ini, biaya atau manfaat apa yang akan bertambah dari platform jika mereka tidak digunakan lagi, dan apa yang dikomunikasikan kepada pengembang ketika API tidak digunakan lagi. Saya menjelajahi topik ini dalam pembicaraan JavaOne saya baru-baru ini, Hutang dan Penghentian . (Slide tersedia di tautan itu; video di sini .) Ternyata JDK itu sendiri tidak terlalu konsisten dalam penggunaan penghinaannya. Ini digunakan untuk mengartikan beberapa hal berbeda, termasuk misalnya,
Ini berbahaya dan Anda harus menyadari risiko menggunakannya (misalnya: Thread.stop()
, Thread.resume()
, dan Thread.suspend()
).
Ini akan dihapus dalam rilis mendatang
Ini sudah usang dan merupakan ide bagus bagi Anda untuk menggunakan sesuatu yang berbeda (contoh: banyak metode di java.util.Date
)
Semua ini adalah makna yang berbeda, dan himpunan bagian yang berbeda berlaku untuk hal-hal yang berbeda yang sudah usang. Dan beberapa bagian dari mereka berlaku untuk hal-hal yang tidak usang (tapi itu mungkin harus dihentikan).
Cloneable
dan Object.clone()
"rusak" dalam arti bahwa mereka memiliki kekurangan desain dan sulit untuk digunakan dengan benar. Namun, clone()
masih merupakan cara terbaik untuk menyalin array, dan kloning memiliki kegunaan terbatas untuk membuat salinan instance kelas yang diimplementasikan dengan hati-hati. Menghapus kloning akan menjadi perubahan yang tidak kompatibel yang akan merusak banyak hal. Operasi kloning dapat diterapkan kembali dengan cara yang berbeda, tetapi mungkin akan lebih lambat daripada Object.clone()
.
Namun, untuk sebagian besar hal, konstruktor salinan lebih disukai daripada kloning. Jadi mungkin menandai Cloneable
sebagai "usang" atau "digantikan" atau sesuatu yang serupa akan sesuai. Ini akan memberi tahu pengembang bahwa mereka mungkin ingin mencari di tempat lain, tetapi itu tidak akan menandakan bahwa mekanisme kloning mungkin dihapus dalam rilis mendatang. Sayangnya, tidak ada penanda seperti itu.
Seperti yang terjadi, "penghentian" tampaknya menyiratkan penghapusan pada akhirnya - terlepas dari kenyataan bahwa sejumlah kecil fitur yang sudah hampir punah telah dihapus - dan penghentian tampaknya tidak diperlukan untuk mekanisme kloning. Mungkin di masa depan tanda alternatif dapat diterapkan yang mengarahkan pengembang untuk menggunakan mekanisme alternatif sebagai gantinya.
MEMPERBARUI
Saya telah menambahkan beberapa riwayat tambahan ke laporan bug . Frank Yellin, pelaksana awal JVM dan penulis bersama spesifikasi JVM, membuat beberapa komentar sebagai tanggapan atas komentar "hilang dalam kabut waktu" dalam rekomendasi TRC yang dikutip dalam jawaban lain . Saya mengutip bagian yang relevan di sini; pesan lengkapnya ada di laporan bug.
Cloneable tidak memiliki metode karena alasan yang sama dengan Serializable tidak. Cloneable menunjukkan properti kelas, daripada secara khusus mengatakan apa pun tentang metode yang didukung kelas.
Sebelum refleksi, kami membutuhkan metode asli untuk membuat salinan dangkal Obyek. Maka Object.clone () lahir. Jelas juga bahwa banyak kelas ingin menimpa metode ini, dan tidak semua kelas ingin dikloning. Oleh karena itu Cloneable dilahirkan untuk menunjukkan niat programmer.
Jadi, singkatnya. Tujuan Cloneable bukan untuk menunjukkan bahwa Anda memiliki metode klon publik (). Itu untuk menunjukkan bahwa Anda bersedia untuk dikloning menggunakan Object.clone (), dan terserah implementasi untuk memutuskan apakah akan membuat clone () publik.