Pertanyaan Perbedaan antara API yang sudah usang dan lama?


Saya sedang mempelajari API warisan di Jawa Collection Framework dan saya belajar bahwa kelas seperti Vector dan HashTable telah digantikan oleh ArrayList dan HashMap.

Namun demikian, mereka TIDAK ditinggalkan, dan dianggap sebagai warisan ketika dasarnya, penghentian diterapkan pada fitur perangkat lunak yang digantikan dan harus dihindari, jadi, saya tidak yakin kapan API dianggap sebagai warisan dan ketika tidak lagi digunakan.


32
2018-05-20 11:36


asal


Jawaban:


Dari glosarium resmi Sun:

bantahan: Mengacu pada kelas, antarmuka, konstruktor, metode atau bidang yang tidak lagi disarankan, dan mungkin tidak ada lagi di versi mendatang.

Dari panduan how-and-when to deprecate:

Anda mungkin pernah mendengar istilah, "humor yang mencela diri sendiri," atau humor yang meminimalkan kepentingan pembicara. Kelas atau metode yang tidak lagi berlaku seperti itu. Itu tidak lagi penting. Sangat tidak penting, pada kenyataannya, bahwa Anda seharusnya tidak lagi menggunakannya, karena telah digantikan dan mungkin tidak ada lagi di masa depan.

Itu @Deprecated anotasi melangkah lebih jauh dan memperingatkan bahaya:

Elemen program dianotasi @Deprecated adalah salah satu programmer yang tidak disarankan untuk menggunakannya, biasanya karena itu berbahaya, atau karena alternatif yang lebih baik ada.

Referensi


Perhatikan bahwa glosarium resmi tidak menentukan arti "warisan". Dalam semua kemungkinan, itu mungkin istilah yang digunakan Josh Bloch tanpa definisi yang tepat. Implikasinya, meskipun, selalu bahwa kelas warisan tidak boleh digunakan dalam kode baru, dan penggantian yang lebih baik ada.

Mungkin kode lama menggunakan warisan tetapi kelas non-deprecated tidak memerlukan tindakan, karena untuk saat ini setidaknya, mereka tidak dalam bahaya tidak ada lagi di versi mendatang.

Sebaliknya, penghentian secara eksplisit memperingatkan bahwa mereka mungkin tidak ada lagi, sehingga tindakan harus dilakukan untuk bermigrasi ke penggantian.


Kutipan dari Java 2nd Edition Efektif

Untuk perbandingan tentang bagaimana istilah-istilah ini digunakan dalam konteks, ini adalah kutipan dari buku tempat kata "tidak berlaku lagi" muncul:

Butir 7: Hindari finalizers: Satu-satunya metode yang mengklaim untuk menjamin finalisasi adalah System.runFinalizersOnExit dan saudara kembarnya yang jahat Runtime.runFinalizersOnExit. Metode-metode ini cacat fatal dan tidak lagi digunakan.

Butir 66: Sinkronisasi akses ke data bersama yang bisa berubah: Perpustakaan menyediakan Thread.stop metode, tetapi metode ini sudah ditinggalkan lama karena itu secara inheren tidak aman - penggunaannya dapat menyebabkan korupsi data.

Butir 70: Keamanan utas dokumen: The System.runFinalizersOnExit metode ini tidak bermusuhan dan sudah tidak digunakan lagi.

Butir 73: Hindari grup utas: Mereka memungkinkan Anda untuk menerapkan tertentu Thread primitif ke sekelompok utas sekaligus. Beberapa primitif ini sudah tidak digunakan lagi, dan sisanya jarang digunakan. [...] kelompok benang sudah usang.

Sebaliknya, ini adalah tanda kutip di mana kata itu "warisan" muncul:

Butir 23: Jangan menggunakan tipe mentah dalam kode baru: Mereka disediakan untuk kompatibilitas dan interoperabilitas dengan kode warisan yang mendahului pengenalan generik.

Butir 25: Lebih suka daftar ke array: Penghapusan adalah apa yang memungkinkan tipe generik untuk beroperasi secara bebas dengan kode warisan yang tidak menggunakan generik.

Butir 29: Pertimbangkan wadah heterogen yang beragam: Pembungkus ini berguna untuk melacak siapa yang menambahkan elemen yang salah ketik ke koleksi dalam aplikasi yang mencampur kode generik dan warisan.

Butir 54: Gunakan metode asli dengan bijaksana: Mereka memberikan akses ke pustaka kode lama, yang pada gilirannya dapat memberikan akses ke data lawas. [...] Juga sah untuk menggunakan metode asli untuk mengakses kode warisan. [...] Jika Anda harus menggunakan metode asli untuk mengakses sumber daya tingkat rendah atau pustaka lawas, gunakan kode asli sesedikit mungkin dan ujilah secara menyeluruh.

Item 69: Lebih suka utilitas konkurensi untuk menunggu dan memberi tahu: Meskipun Anda harus selalu menggunakan utilitas konkurensi dalam preferensi untuk wait dan notify, Anda mungkin harus mempertahankan kode warisan yang digunakan wait dan notify.

Kutipan ini tidak dipilih dengan cermat: mereka SEMUA contoh di mana kata "tidak berlaku lagi" dan "warisan" muncul di buku. Pesan Bloch jelas di sini:

  • Metode tidak berlaku lagi, mis. Thread.stop, berbahaya, dan seharusnya tak pernah digunakan sama sekali.
  • Di sisi lain, mis. wait/notify dapat tetap menggunakan kode warisan, tetapi tidak boleh digunakan dalam kode baru.

Pendapat subjektif saya sendiri

Interpretasi saya adalah bahwa mencela sesuatu adalah mengakui bahwa itu adalah kesalahan, dan tidak pernah baik untuk memulai. Di sisi lain, mengklasifikasikan bahwa sesuatu adalah warisan yang mengakui bahwa itu cukup baik di masa lalu, tetapi telah memenuhi tujuannya dan tidak lagi cukup baik untuk masa sekarang dan masa depan.


25
2018-05-20 11:49



Interpretasi umum adalah bahwa Deprecated berarti bahwa itu akan dihapus dalam waktu dekat, dan Legacy berarti bahwa itu akan tetap untuk kompatibilitas ke belakang atau alasan lain.

Keduanya berarti bahwa mereka tidak boleh digunakan oleh kode baru.

Dalam kasus JDK, kode tidak berlaku lagi akan tetap ada, karena kompatibilitas mundur sangat penting untuk Java JDK.


13
2018-05-20 11:38



Penghentian sering menunjukkan bahwa ada niat untuk menghapus fungsi di beberapa titik di masa depan, sedangkan warisan hanya berarti itu tidak boleh digunakan dalam kode baru jika keadaan memungkinkan (meskipun mungkin kemudian diperlukan untuk alasan interop).


0
2018-05-20 11:39



Itu Tidak berlaku lagi anotasi memberikan definisi formal tentang API yang tidak digunakan lagi. Saya tidak berpikir bahwa definisi formal untuk kelas legacy ada. Keduanya sebenarnya berarti bahwa kelas tidak boleh digunakan dalam kode baru.


0
2018-05-20 11:46



Saya punya saran - warisan mengacu pada kode yang ditulis di masa lalu, tidak lagi mengacu pada saran untuk tidak menggunakannya lagi. Anda masih dapat menggunakan api yang usang, tetapi Anda tidak dapat menulis kode warisan, karena Anda sedang menulisnya sekarang. Hanya IMHO


0
2018-05-20 11:46



Penghentian berarti itu buruk dan tidak boleh digunakan - File.toURL() adalah contoh utama, karena tidak membuat URL yang benar dari file dengan spasi di jalur. Itu hanya tidak melakukan apa yang seharusnya, tetapi karena kode yang ada mungkin menggunakan workarounds yang akan pecah jika bug itu diperbaiki

Legacy hanya berarti itu sudah tua dan ada cara-cara melakukan sesuatu yang umumnya, tetapi tidak harus, lebih baik. Vector adalah contoh yang baik - itu adalah sebuah List implementasi, tetapi masih ada beberapa omong kosong jelek dari hari-hari sebelum API Koleksi (yaitu, List) dirancang. Ini juga disinkronkan, yang berarti bahwa Anda harus membayar biaya sinkronisasi bahkan ketika menggunakannya dalam skenario single-threaded (kecuali dalam beberapa situasi di mana VM itu pintar). ArrayList lebih baik jika Anda menginginkan implementasi daftar array yang didukung karena tidak disinkronkan, dan Collections.synchronizedList lebih fleksibel ketika Anda menginginkan daftar yang disinkronkan karena ini adalah pembungkus yang dapat digunakan dengan semua implementasi daftar (daftar yang ditautkan, daftar dari Arrays.asList(T...), dll). Namun, jika Anda melakukan kebetulan ingin tersinkronisasi, aplikasi daftar array-didukung, kemudian Vector baik-baik saja.


0
2018-05-20 12:36



Interpretasi saya adalah bahwa kode Legacy hanya memiliki rekan-rekan yang lebih baru yang melakukan pekerjaan dengan lebih baik. Namun, akan terus menerima perbaikan bug dan dukungan lainnya. Kode yang ditinggalkan, di sisi lain, tidak didukung dan tidak akan menerima perbaikan bug khusus.


0
2018-05-20 14:30