Apakah salah menggunakan metode yang tidak digunakan atau kelas di Jawa?

153

Saya menggunakan gerhana untuk mengembangkan aplikasi web. Baru hari ini saya telah memperbarui versi struts saya dengan mengubah file JAR. Saya mendapat peringatan di beberapa tempat bahwa metode sudah usang, tetapi kodenya berfungsi dengan baik.

Saya ingin tahu beberapa hal

  1. Apakah salah menggunakan metode yang tidak digunakan atau kelas di Jawa?

  2. Bagaimana jika saya tidak mengubah metode apa pun dan menjalankan aplikasi saya dengan peringatan yang saya miliki, apakah itu akan menimbulkan masalah kinerja.

Umesh Aawte
sumber
7
Apakah Anda akan 'melanjutkan' mengemudi 1955 Volkswagen Beetlebahkan jika Anda ditawari Corvette Stingraysecara gratis? (0:
KMån
75
@KMan Anda membandingkan mobil Eropa dengan mobil Amerika?;)
ponzao
2
@Ponzao dan 4lainnya: Gotcha! (0;
KMån
2
Salah? Apakah kita berbicara fana atau hanya penggelembungan ringan di sini?
FastAl
5
@Alexander tidak memberi suara untuk komentar Anda, jadi beri +1 untuk Anda juga;) dalam hal apa pun, tegaskan bahwa kode baru 1000 lebih baik daripada kode lama. Perbandingannya akan lebih baik antara 1955 Volkswagen Beetledan 1956 Volkswagen Beetledengan ban baru yang Anda tidak tahu kapan akan rusak!
Aleks

Jawaban:

265

1. Apakah salah menggunakan metode yang tidak digunakan atau kelas di Jawa?

Dari definisi usang :

Elemen program yang beranotasi @Deprecated adalah salah satu yang tidak dianjurkan oleh para programmer, biasanya karena berbahaya, atau karena ada alternatif yang lebih baik.

Metode ini disimpan dalam API untuk kompatibilitas ke belakang untuk periode waktu yang tidak ditentukan, dan mungkin dalam rilis mendatang dihapus. Artinya, tidak, itu tidak salah , tetapi ada cara yang lebih baik untuk melakukannya, yang lebih kuat terhadap perubahan API.

2. Bagaimana jika saya tidak mengubah metode apa pun dan menjalankan aplikasi saya dengan peringatan yang saya miliki, apakah itu akan membuat masalah kinerja.

Kemungkinan besar tidak. Ini akan terus bekerja seperti sebelum penghentian. Kontrak metode API tidak akan berubah. Jika beberapa struktur data internal berubah ke arah metode baru yang lebih baik, mungkin ada dampak kinerja, tetapi sangat kecil kemungkinannya.


The paling lucu bantahan dalam API Java, adalah imo, yang FontMetrics.getMaxDecent. Alasan penghentian: Kesalahan pengejaan.

Usang. Pada JDK versi 1.1.1, digantikan oleh getMaxDescent ().

aioobe
sumber
5
Penghentian paling lucu berikutnya di Java API adalah setMultiClickThreshhold (int threshhold) dan getMultiClickTreshhold () di AbstractButton (Swing). Bersiaplah untuk keduanya! ;)
JavaTechnical
3
Kita perlu melakukan ini dengan HTTP REFERER. Ini menjengkelkan: en.wikipedia.org/wiki/HTTP_referer
kmiklas
1
@DaveMcClelland, buat 70 dari 69: D;)
VdeX
28

Anda masih dapat menggunakan kode yang sudah usang tanpa kinerja diubah, tetapi inti dari penghentian suatu metode / kelas adalah untuk memberi tahu pengguna bahwa sekarang ada cara yang lebih baik untuk menggunakannya, dan bahwa dalam rilis yang akan datang kode yang sudah usang tersebut kemungkinan akan dihapus.

abyx
sumber
1
Bagaimana Anda bisa yakin bahwa itu tanpa perubahan kinerja? Deprication yang bisa misalnya disebabkan oleh perubahan struktur data internal, mengatakan dari HashSet ke TreeSet, misalnya.
aioobe
@aioobe - Menurut pemahaman saya, OP bertanya apakah memanggil kode yang sudah usang memiliki masalah kinerja, yang tidak diberikan bahwa itu tidak mengubah kode byte yang dihasilkan (sebelum 1,5 ada di javadoc, sekarang penjelasannya sedang digunakan, tetapi masih tidak ada perubahan kinerja)
abyx
Ketika berpindah dari satu versi pustaka ke versi lainnya, tidak ada jaminan bahwa kode byte metode dalam versi baru identik dengan kode byte metode yang sama di versi sebelumnya.
aioobe
@aioobe - ada jaminan bahwa dengan membuatnya tidak digunakan lagi tidak akan mengubah kode byte, yang menurut saya maksud OP. Tentu saja kode itu sendiri berubah, itulah sebabnya kami mencabut kode.
abyx
Jika Anda tetap menggunakan versi yang sama seperti sebelumnya, tidak ada perubahan. Tetapi jika Anda menggunakan versi pustaka yang lebih baru, dan mereka tidak mencabut API, mungkin BISA ada perubahan dalam kinerja, jika implementasi yang mendasarinya diubah secara drastis dan API baru mengambil keuntungan darinya, sementara API yang lebih lama tidak efisien seperti dulu, terhadap struktur yang lebih baru ini.
gregturn
21

Terminologi

Dari glosari resmi Matahari:

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

Dari panduan cara-dan-kapan tidak lagi digunakan:

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

The @Deprecatedpenjelasan melangkah lebih jauh dan memperingatkan bahaya:

Elemen program yang dianotasi @Deprecatedadalah salah satu yang tidak dianjurkan oleh programmer, biasanya karena berbahaya , atau karena ada alternatif yang lebih baik.

Referensi


Benar atau salah?

Pertanyaan apakah benar atau salah menggunakan metode yang sudah usang harus diperiksa secara individual. Berikut adalah SEMUA kutipan di mana kata "usang" muncul di Java 2 Edisi Efektif :

Butir 7: Hindari finalizer : Satu-satunya metode yang mengklaim menjamin finalisasi adalah System.runFinalizersOnExitdan saudara kembarnya yang jahat Runtime.runFinalizersOnExit. Metode ini cacat fatal dan telah ditinggalkan.

Butir 66: Menyinkronkan akses ke data yang dapat berubah yang dibagikan : Perpustakaan menyediakan Thread.stopmetode tersebut, tetapi metode ini sudah lama tidak digunakan karena secara inheren tidak aman - penggunaannya dapat menyebabkan korupsi data.

Butir 70: Keamanan utas dokumen : System.runFinalizersOnExitMetode ini tidak ramah terhadap benang dan telah usang.

Butir 73: Hindari grup utas : Mereka memungkinkan Anda menerapkan Threadprimitif tertentu ke banyak utas sekaligus. Beberapa primitif ini telah ditinggalkan, dan sisanya jarang digunakan. [...] grup utas sudah usang.

Jadi setidaknya dengan semua metode di atas, jelas salah untuk menggunakannya, setidaknya menurut Josh Bloch.

Dengan metode lain, Anda harus mempertimbangkan masalah secara individual, dan memahami MENGAPA mereka ditinggalkan, tetapi secara umum, ketika keputusan untuk tidak berlaku lagi dibenarkan, itu akan cenderung condong ke arah yang salah daripada hak untuk terus menggunakannya.

Pertanyaan-pertanyaan Terkait

polygenelubricants
sumber
3
"Sudah ditinggalkan" berasal dari bahasa Latin "de" + "precare" yang berarti "berdoa menentang". Ketika sesuatu dideskripsikan sebagai sesuatu yang sudah usang, suatu Standar sedang berdoa - memohon - Anda tidak menggunakannya; itu peringatan bahwa itu dapat dihapus dalam versi masa depan dari Standar itu. Perhatikan bahwa fitur yang sudah tidak berlaku lagi harus diterapkan sepenuhnya dalam implementasi versi apa pun dari Standar saat ini. Namun, penyebutan Anda tentang humor yang merendahkan diri sedikit tidak masuk akal; "mencela diri sendiri" dalam arti itu adalah korupsi dari "mencela diri sendiri", yang memiliki derivasi dan makna yang berbeda.
dajames
17

Selain dari semua tanggapan luar biasa di atas, saya menemukan ada alasan lain untuk menghapus panggilan API yang sudah tidak digunakan lagi.

Menjadi meneliti mengapa panggilan sudah usang Saya sering menemukan diri saya belajar hal-hal menarik tentang Java / API / Framework. Sering ada alasan bagus mengapa suatu metode tidak digunakan lagi dan memahami alasan-alasan ini mengarah pada wawasan yang lebih dalam.

Jadi dari perspektif pembelajaran / pertumbuhan, ini juga merupakan upaya yang bermanfaat

Peter Tillemans
sumber
11

Ini tentu saja tidak membuat masalah kinerja - berarti usang di masa depan kemungkinan fungsi tidak akan menjadi bagian dari perpustakaan lagi, jadi Anda harus menghindari menggunakannya dalam kode baru dan mengubah kode lama Anda untuk berhenti menggunakannya, jadi Anda tidak mengalami masalah suatu hari ketika Anda meningkatkan struts dan menemukan bahwa fungsi tidak lagi ada

Michael Mrozek
sumber
1
Menilai dari pengalaman, "usang" benar-benar berarti "Anda tidak boleh menggunakan ini lagi, tetapi itu akan tersedia untuk selama-lamanya." Setidaknya untuk Java Standard API, saya tidak mengetahui adanya metode atau kelas yang benar-benar dihapus setelah ditinggalkan.
Michael Borgwardt
1
@Michael Yah, dalam praktiknya, API jarang menghapus fungsi yang tidak digunakan lagi karena mereka bisa tidak digunakan lagi selama sepuluh tahun dengan kompiler mengeluarkan "PERINGATAN: BERHENTI MENGGUNAKAN KAMU INI", dan orang-orang masih akan membatalkan hari ketika mereka akhirnya menghapusnya. Saya pikir usang seharusnya berarti "suatu hari kita ingin mengambil ini, jadi tolong berhenti menggunakannya", bahkan jika dalam prakteknya itu jarang benar-benar terjadi
Michael Mrozek
@Michael Mrozek: Tidak setuju dengan pernyataan itu It certainly doesn't create a performance issue; terlalu subjektif untuk menyatakan itu.
KMån
1
@KMan Fungsi yang ditandai sebagai usang tidak entah bagaimana membuatnya kurang efisien daripada sebelum ditandai - itu akan berjalan persis sama seperti sebelumnya
Michael Mrozek
@Michael Borgwardt: Begitulah cara kerjanya di sebagian besar bahasa standar. Dan, tentu saja, jika sesuatu yang sudah usang harus dihapus dari standar, implementasi populer akan menjadikannya sebagai perpanjangan.
David Thornley
8

Itu tidak salah, hanya saja tidak direkomendasikan. Ini umumnya berarti bahwa pada titik ini ada cara yang lebih baik dalam melakukan sesuatu dan Anda akan melakukan yang baik jika Anda menggunakan cara yang lebih baik. Beberapa barang usang benar-benar berbahaya dan harus dihindari sama sekali. Cara baru dapat menghasilkan kinerja yang lebih baik daripada yang usang, tetapi tidak selalu demikian.

Bozhidar Batsov
sumber
8

Anda mungkin pernah mendengar istilah, "humor mencela diri sendiri". Itu adalah humor yang meminimalkan kepentingan Anda. Kelas atau metode yang sudah usang seperti itu. Itu tidak lagi penting. Ini sangat tidak penting, pada kenyataannya, itu seharusnya tidak lagi digunakan sama sekali, karena mungkin akan tidak ada lagi di masa depan.

Cobalah menghindarinya

Jigar Joshi
sumber
4
  1. Umumnya tidak, itu tidak sepenuhnya salah untuk menggunakan deprecatedmetode selama Anda memiliki rencana kontingensi yang baik untuk menghindari masalah jika / ketika metode tersebut hilang dari perpustakaan yang Anda gunakan. Dengan Java API itu sendiri hal ini tidak pernah terjadi tetapi dengan hal lain itu berarti akan dihapus. Jika Anda secara khusus berencana untuk tidak memutakhirkan ( walaupun kemungkinan besar dalam jangka panjang ) perpustakaan pendukung perangkat lunak Anda maka tidak ada masalah dalam menggunakan deprecatedmetode.
  2. Tidak.
Esko
sumber
3

Ya itu salah.

Metode atau kelas yang sudah tidak digunakan lagi akan dihapus di versi Java yang akan datang dan tidak boleh digunakan. Dalam setiap kasus, harus ada alternatif yang tersedia. Gunakan itu.

Ada beberapa kasus ketika Anda harus menggunakan kelas atau metode yang sudah usang untuk memenuhi tujuan proyek. Dalam hal ini, Anda benar-benar tidak punya pilihan selain menggunakannya. Versi Java di masa depan mungkin memecah kode itu, tetapi jika itu adalah persyaratan Anda harus hidup dengan itu. Mungkin ini bukan pertama kalinya Anda harus melakukan sesuatu yang salah untuk memenuhi persyaratan proyek, dan itu pasti bukan yang terakhir.

Saat Anda memutakhirkan ke versi Java yang baru atau pustaka lain, terkadang metode atau kelas yang Anda gunakan menjadi usang. Metode usang tidak didukung, tetapi seharusnya tidak menghasilkan hasil yang tidak terduga. Itu tidak berarti bahwa mereka tidak akan, jadi ganti kode Anda ASAP.

Proses penghentian ada untuk memastikan bahwa penulis memiliki cukup waktu untuk mengubah kode mereka dari API lama ke API baru. Manfaatkan waktu ini. Ubah kode Anda menjadi ASAP.

Erick Robertson
sumber
2

Ini tidak salah, tetapi beberapa metode yang sudah usang dihapus dalam versi perangkat lunak yang akan datang, sehingga Anda mungkin akan berakhir dengan kode yang tidak berfungsi.

Petar Minchev
sumber
Removed? Lihat definisi stackoverflow.com/questions/2941900/…
KMån
1
@KMan - di tautan yang Anda poskan tertulis - "Metode ini disimpan dalam API untuk kompatibilitas mundur untuk periode waktu yang tidak ditentukan, dan mungkin dalam rilis mendatang akan DIHAPUS." Saya telah menulis hal yang sama - beberapa metode yang sudah usang mungkin dihapus dalam waktu dekat atau jauh.
Petar Minchev
2

Apakah salah menggunakan metode atau kelas yang tidak digunakan lagi di Jawa? "

Tidak salah seperti itu tetapi dapat menghemat beberapa masalah. Berikut adalah contoh di mana sangat tidak disarankan untuk menggunakan metode yang sudah usang:

http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

Mengapa Thread.stop sudah tidak digunakan lagi?

Karena secara inheren tidak aman. Menghentikan utas menyebabkannya membuka kunci semua monitor yang telah dikunci. (Monitor tidak terkunci karena pengecualian ThreadDeath menyebarkan tumpukan.) Jika salah satu objek yang sebelumnya dilindungi oleh monitor ini berada dalam keadaan tidak konsisten, utas lain sekarang dapat melihat objek ini dalam keadaan tidak konsisten. Benda-benda seperti itu dikatakan rusak. Ketika utas beroperasi pada objek yang rusak, perilaku sewenang-wenang dapat terjadi. Perilaku ini mungkin halus dan sulit dideteksi, atau mungkin diucapkan. Tidak seperti pengecualian yang tidak dicentang lainnya, ThreadDeath membunuh thread secara diam-diam; dengan demikian, pengguna tidak memiliki peringatan bahwa programnya mungkin rusak. Korupsi dapat memanifestasikan dirinya kapan saja setelah kerusakan yang sebenarnya terjadi, bahkan berjam-jam atau berhari-hari di masa depan.


Bagaimana jika tidak mengubah metode apa pun dan menjalankan aplikasi saya dengan peringatan yang saya miliki, apakah itu akan membuat masalah kinerja.

Seharusnya tidak ada masalah dalam hal kinerja. API standar dirancang untuk menghormati beberapa kompatibilitas ke belakang sehingga aplikasi dapat secara bertahap disesuaikan dengan versi Java yang lebih baru.

James P.
sumber
2

Apakah salah menggunakan metode atau kelas yang tidak digunakan lagi di Jawa? Ini bukan "salah", masih berfungsi tetapi hindarilah sebisa mungkin.

Misalkan ada kerentanan keamanan yang terkait dengan metode dan pengembang menentukan bahwa itu adalah cacat desain. Jadi mereka mungkin memutuskan untuk tidak lagi menggunakan metode ini dan memperkenalkan cara baru.

Jadi, jika Anda masih menggunakan metode lama, Anda memiliki ancaman. Jadi berhati-hatilah dengan alasan penghinaan itu dan periksa apakah pengaruhnya terhadap Anda.

bagaimana jika tidak mengubah metode apa pun dan menjalankan aplikasi saya dengan peringatan yang saya miliki, apakah itu akan membuat masalah kinerja.

Jika penghentian karena masalah kinerja, maka Anda akan menderita masalah kinerja, jika tidak, tidak ada alasan untuk memiliki masalah seperti itu. Sekali lagi ingin menunjukkan, menyadari alasan penghinaan.

Chathuranga Chandrasekara
sumber
2

Di Jawa itu @Deprecated, di C # itu [Usang].

Saya pikir saya lebih suka terminologi C #. Itu hanya berarti sudah usang. Anda masih dapat menggunakannya jika Anda mau, tetapi mungkin ada cara yang lebih baik.

Ini seperti menggunakan Windows 3.1 daripada Windows 7 jika Anda percaya bahwa Windows 3.1 sudah usang. Anda masih dapat menggunakannya, tetapi mungkin ada fitur yang lebih baik di versi masa depan, ditambah versi masa depan mungkin akan didukung - yang usang tidak akan.

Sama untuk @Deprecated Java - Anda masih dapat menggunakan metode ini, tetapi dengan risiko Anda sendiri - di masa depan, mungkin ada alternatif yang lebih baik, dan bahkan mungkin tidak didukung.

Jika Anda menggunakan kode yang sudah usang, biasanya baik-baik saja, asalkan Anda tidak perlu memutakhirkan ke API yang lebih baru - kode yang sudah usang mungkin tidak ada di sana. Saya sarankan jika Anda melihat sesuatu yang menggunakan kode usang, untuk memperbarui untuk menggunakan alternatif yang lebih baru (ini biasanya ditunjukkan pada penjelasan atau dalam komentar usang Javadoc).

Sunting: Dan seperti yang ditunjukkan oleh Michael, jika alasan penghentian adalah karena cacat dalam fungsi (atau karena fungsi itu seharusnya tidak ada), maka jelas, orang tidak boleh menggunakan kode yang sudah usang.

jamiebarrow
sumber
1
"Jika Anda menggunakan kode yang sudah usang, tidak apa-apa, asalkan Anda tidak perlu memutakhirkan ke API yang lebih baru" - tidak cukup. Lihatlah mengapa Thread.stop () sudah usang, dan Anda akan melihat bahwa Thread.stop tidak ada, di versi JRE mana pun.
Michael
Ok, saya lebih suka mengatakan "biasanya" baik-baik saja (akan memperbarui sedikit itu) :) Oleh karena itu, gunakan dengan risiko Anda sendiri. Jelas, jika alasan untuk menghentikannya adalah untuk menghentikan cacat dalam fungsinya, masuk akal untuk tidak menggunakannya. Secara umum, tidak masalah menggunakan metode yang sudah tidak digunakan lagi. Jadi ja, itu semua tergantung pada alasan penghinaan. Benar.
jamiebarrow
1

Tentu saja tidak - karena seluruh Java mendapatkan @Deprecated :-) Anda dapat menggunakannya selama Java berlangsung. Tidak akan melihat adanya perbedaan, kecuali itu sesuatu yang benar-benar rusak. Artinya - harus membaca tentang itu dan kemudian memutuskan.

Namun dalam .Net, ketika sesuatu dinyatakan [Usang], buka dan bacalah segera meskipun Anda belum pernah menggunakannya - Anda memiliki peluang 50% lebih efisien dan / atau lebih mudah digunakan daripada penggantian :-))

Jadi secara umum, ini bisa sangat bermanfaat untuk menjadi techno-konservatif hari ini, tetapi Anda harus melakukan tugas membaca Anda terlebih dahulu.

ZXX
sumber
1

Saya merasa bahwa metode usang berarti; ada metode alternatif = ive yang tersedia yang lebih baik di semua aspek daripada metode yang ada. Lebih baik menggunakan metode yang baik daripada metode lama yang ada. Untuk kompatibilitas mundur, metode lama dibiarkan usang.

DPM
sumber