Secara umum dipahami bahwa Cloneable
antarmuka di Java rusak. Ada banyak alasan untuk ini, yang tidak akan saya sebutkan; yang lain sudah melakukannya. Itu juga posisi arsitek Jawa sendiri.
Karena itu pertanyaan saya adalah: mengapa belum ditinggalkan? Jika tim inti Java telah memutuskan bahwa itu rusak, maka mereka juga harus mempertimbangkan penghentian. Apa alasan mereka untuk tidak melakukannya (di Jawa 8 masih belum ditinggalkan )?
Cloneable
dikenal luas.Jawaban:
Ada bug yang diajukan pada tahun 1997 ke Java Bug Database tentang menambahkan
clone()
metodeCloneable
, jadi itu tidak akan sia-sia. Itu ditutup dengan resolusi "tidak akan diperbaiki" dan pembenarannya adalah sebagai berikut:Jadi, meskipun ini tidak secara langsung tentang usang , alasan untuk tidak membuat Cloneable "usang" adalah bahwa Technical Review Comitee memutuskan bahwa memodifikasi dokumentasi yang ada akan cukup memadai untuk membuat antarmuka ini berguna. Dan begitulah yang mereka lakukan. Hingga Java 1.4,
Cloneable
didokumentasikan sebagai berikut:Sejak Java 1.4 (yang dirilis pada Februari 2002) hingga edisi saat ini (Java 8) kelihatannya seperti ini:
sumber
clone
metode itu adaObject
di tempat pertama?Object#clone()
menghasilkan instance dari kelas yang sama seperti aslinya tanpa kelas yang diketahui pada waktu kompilasi.Jawaban singkat untuk "mengapa tidak
Cloneable
usang?" (atau memang, mengapa tidakX
usang, untuk semuaX
) 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
danremovePropertyChangeListener
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 dariPack200
; 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()
, danThread.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
danObject.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 daripadaObject.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.
sumber
Object.clone()
ke dalam api hanya karena semua orang ingin, tetapi Anda bersedia untuk bernalar dan mengemukakan hal-hal baik dari itu.array.clone()
selalu lebih cepat daripada alternatif apa pun. Dari perspektif API, ini adalah cara paling ringkas untuk menduplikasi array.Arrays.copyOf(array, newlen)
mendekati, tetapi membutuhkan parameter panjang, yang berlebihan jika Anda tidak mengubah panjangnya.Thread.suspend()
danThread.stop()
(tanpa arg) berbahaya, mereka mungkin tidak akan dihapus - atau diubah untuk melemparkan pengecualian tanpa syarat - karena orang benar-benar menggunakannya! Agaknya mereka bersedia menanggung risiko. Salah satu faktor yang meringankan dengan pendengar perubahan properti adalah bahwa mereka digunakan sangat jarang, sehingga dampak menghapusnya kecil.java.beans
dapat dibuat independenjava.desktop
karena kacang hanyalah API perpustakaan untuk properti. Sayangnya, jika Anda menggali API kacang, ada banyak ketergantungan pada AWT. Implementasinya bahkan lebih. Tentu saja mungkin untuk membebaskan mereka, tetapi melakukan hal itu sepertinya lebih banyak pekerjaan daripada, katakanlah, melemahkan penebangan dari kacang. Seluruh upaya modularisasi adalah tentang melakukan penguraian ini; tidak diragukan lagi banyak yang bisa dilakukan, tetapi kemudian Jigsaw akan memakan waktu lebih lama.Karena JCP tidak cocok untuk melakukannya, dan mungkin tidak pernah melakukannya. Tanya mereka. Anda bertanya di tempat yang salah.
Tidak seorang pun akan pernah menghapus apa pun dari Java API, karena persyaratan kompatibilitas ke belakang. Terakhir kali yang terjadi adalah perubahan dalam model acara AWT antara 1.0 dan 1.1 pada 1996/7.
sumber
Thread.stop(Throwable)
dengan mengubah kontraknya untuk selalu melemparkanUnsupportedOperationException
ke penelepon (bukan ke utas target!).Thread.stop(Throwable)
fungsi terjadi di Java 8. Lagi pula, saran yang tidak memenuhi syarat untuk "meminta mereka" salah karena hari ini kepala arsitek Jawa sendiri adalah anggota aktif di Stack Overflow. Dia hanya tidak repot-repot menjawab apa pun kecuali pertanyaan yang terkait dengan Streaming.Cloneable
akan dihapus dari Java API. Saya bertanya mengapa itu tidak akan hilang. Dan saya pikir ini adalah tempat yang sempurna untuk bertanya.