Apakah praktik yang baik untuk menggunakan peringatan penekanan dalam kode Anda?


11

Saya menggunakan @SuppressWarnings("unchecked")dan @SuppressWarnings("null")sebagian besar metode di atas untuk membiarkan kode dikompilasi tanpa peringatan, tetapi saya ragu. Ditemukan pertanyaan Stackoverflow ini . Jon Skeet menulis jawaban yang menurut saya menarik.

Menurut dia,

Kadang-kadang generik Java tidak membiarkan Anda melakukan apa yang Anda inginkan, dan Anda perlu memberi tahu kompiler secara efektif bahwa apa yang Anda lakukan benar-benar legal pada waktu pelaksanaan.

Tetapi bagaimana jika ada kemungkinan pengecualian akan dilemparkan? Bukankah menekan peringatan adalah ide yang buruk? Tidakkah seharusnya saya menyadari tempat-tempat di mana masalah bisa muncul?

Juga, bagaimana jika orang lain memodifikasi kode saya nanti dan menambahkan beberapa fungsi yang dipertanyakan tanpa menghapus SuppressWarnings? Bagaimana itu bisa dihindari dan / atau ada alternatif lain untuk ini?

Haruskah saya menggunakan @SuppressWarnings("unchecked")dan @SuppressWarnings("null")?


Perbarui # 1

Sejauh jenis cast yang tidak dicentang pergi, menurut jawaban ini (ditunjukkan oleh @gnat dalam komentar di bawah), menekan peringatan ini diperlukan.

Banyak perpustakaan Java yang sangat diperlukan tidak pernah diperbarui untuk menghilangkan kebutuhan akan typecast yang tidak aman. Menekan peringatan itu diperlukan agar peringatan lain yang lebih penting akan diperhatikan dan diperbaiki.

Dalam hal menekan peringatan lainnya, masih ada sedikit area abu-abu.


Perbarui # 2

Sesuai Oracle Docs (juga disebutkan oleh beberapa jawaban di bawah):

Sebagai soal gaya, programmer harus selalu menggunakan anotasi ini pada elemen yang paling bersarang di mana itu efektif. Jika Anda ingin menekan peringatan dalam metode tertentu, Anda harus mencatat metode itu daripada kelasnya.



@gnat Mereka tidak berbicara tentang tipe pemain yang tidak dicentang‽
Bilesh Ganguly

1
mereka melakukannya : "Banyak perpustakaan Jawa yang sangat diperlukan tidak pernah diperbarui untuk menghilangkan kebutuhan akan typecast yang tidak aman. Menekan peringatan itu diperlukan agar peringatan lain yang lebih penting akan diperhatikan dan diperbaiki."
nyamuk

2
Saya pikir masalah dengan duplikat itu adalah tentang C # - ada beberapa alasan khusus Jawa yang berbeda dari ide umum untuk menekan peringatan kompiler.

Jawaban:


26

Bagi saya, inti dari menekan peringatan adalah untuk mempertahankan "tagihan kesehatan yang bersih" untuk proyek Anda. Jika Anda tahu bahwa seluruh basis kode Anda mengkompilasi dengan bersih, itu segera jelas ketika seseorang melakukan kesalahan yang menyebabkan peringatan pertama muncul di daftar masalah. Anda kemudian dapat memperbaiki kesalahan atau menekannya jika Anda dapat membuktikan bahwa itu palsu.

Tetapi jika Anda memiliki 21 peringatan di sana untuk memulai, kemungkinan besar Anda akan mengabaikan peringatan ke 22 ketika seseorang menyebabkannya, dan Anda tidak memeriksa apakah itu tidak berbahaya. Itu berarti bahwa masalah dapat masuk ke basis kode Anda dan Anda tidak akan pernah menyadarinya.

Peringatan adalah item informasi yang berguna. Pastikan Anda memperhatikan orang-orang yang berbicara kebenaran, dan menyaring orang-orang yang tidak. Jangan biarkan orang-orang membaur dua jenis sehingga Anda kehilangan sistem peringatan dini Anda.

Edit

Saya mungkin harus mengklarifikasi bahwa menekan peringatan yang memang memiliki prestasi adalah hal yang konyol untuk dilakukan. Tagihan kesehatan yang Anda peroleh dengan cara curang tidak ada artinya. Diberi pilihan, Anda harus selalu memperbaiki masalah yang dilihat oleh kompiler daripada hanya menutup mata Anda terhadapnya. Namun, ada area di mana kompiler tidak dapat memastikan apakah sesuatu akan menjadi masalah atau tidak (generik Java adalah salah satu area seperti itu), dan ada pilihan yang lebih baik adalah untuk meninjau setiap contoh seperti itu dan kemudian menekan peringatan di tempat tertentu ini daripada daripada mematikan kelas peringatan ini sama sekali dan berpotensi melewatkan yang asli.


1
Saya setuju sebagian bahwa mulai dari papan tulis "bersih" membantu Anda menangkap peringatan di lain waktu, faktanya kode yang dikompilasi dengan bersih mungkin tidak berjalan dengan bersih.
user949300

Masalah yang saya miliki di tempat kerja adalah saya sering mendapat peringatan yang ditekan orang lain karena mereka tidak mengerti apa yang dikatakannya. Jadi saya kira apakah suatu peringatan pantas atau tidak merupakan masalah subyektif. : /
Trejkaz

16

Menekan peringatan adalah sesuatu yang perlu dilakukan dengan sangat hati-hati.

Peringatan berarti: Kompiler menemukan sesuatu yang terlihat cerdik. Ini tidak berarti itu adalah cerdik, itu hanya tampak seperti itu untuk compiler. Terkadang Anda memiliki kode yang baik-baik saja dan memberikan peringatan. Terkadang Anda memperbaikinya dengan sedikit mengubah kode Anda. Terkadang kompiler memiliki beberapa fitur khusus untuk tujuan itu. Misalnya dimana

if (x = someFunction ()) { ... }

memberi peringatan tapi

if ((x = someFunction ())) { ... }

tidak. Dalam kasus pertama, sebuah peringatan dengan asumsi bahwa Anda mungkin bermaksud == dan bukan =. Dalam kasus kedua tidak ada peringatan karena tanda kurung tambahan memberitahu kompiler "Saya tahu apa yang saya lakukan". Tentu lebih baik

if ((x = someFunction ()) != 0) { ... }

atau menggunakan dua baris.

Dan kadang-kadang, sangat jarang, ada kasus-kasus ketika kode Anda baik-baik saja tetapi Anda tidak bisa menulisnya dengan cara yang diterima tanpa peringatan. Dalam kasus yang sangat, sangat langka, Anda menonaktifkan peringatan untuk pernyataan itu dan langsung menghidupkannya setelah itu. Itu pilihan terakhir. Dan Anda hanya menonaktifkan peringatan khusus itu, tidak ada yang lain.

Namun, beberapa orang hanya menonaktifkan peringatan untuk menghilangkan peringatan, karena mereka terlalu malas untuk mencari tahu dan memperbaiki alasan peringatan yang sah terlebih dahulu. Atau mereka bahkan tidak mencoba menulis kode yang bebas dari peringatan. Itu hal yang sangat tidak sehat untuk dilakukan.


2
Saya pikir Anda mungkin kehilangan beberapa kurung penutup dalam contoh kedua dan ketiga Anda.
8bittree

1
Setuju

7

Menekan peringatan untuk seluruh metode dicurigai. Lebih baik untuk menekan peringatan untuk baris tertentu, dengan komentar . misalnya

@SuppressWarnings("unchecked") Foo foo = (Foo)object; // Using old library requires this cast

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.