Kodunuzda baskılama uyarılarını kullanmak iyi bir uygulama mı?


11

Kullandığım @SuppressWarnings("unchecked")ve @SuppressWarnings("null")herhangi bir uyarı olmadan kod derleme izin çoğunlukla yöntemlerle yukarıda ama benim şüphelerim var. Bu Stackoverflow sorusunu buldum . Jon Skeet ilgi çekici bulduğum bir cevap yazdı .

Ona göre,

Bazen Java jenerikleri sadece istediğiniz şeyi yapmanıza izin vermez ve derleyiciye yaptığınız işin gerçekten yürütme zamanında yasal olacağını söylemeniz gerekir.

Ama ya bir istisna fırlatma şansı varsa? Uyarıları bastırmak o zaman kötü bir fikir değil mi? Sorunların ortaya çıkabileceği yerlerin farkında olmamalı mıyım?

Ayrıca, başka biri kodumu daha sonra değiştirir ve SuppressWarnings'i kaldırmadan şüpheli bir işlevsellik eklerse ne olur? Bu nasıl önlenebilir ve / veya buna başka bir alternatif var mı?

Ben kullanarak olmalı @SuppressWarnings("unchecked")ve @SuppressWarnings("null")?


Güncelleme # 1

Denetlenmeyen tipte yayınlar söz konusu olduğunda, bu cevaba göre (aşağıdaki yorumlarda @gnat tarafından belirtilmiştir), bu uyarıların bastırılması gereklidir.

Birçok zorunlu Java kütüphanesi, güvenli olmayan daktilolara duyulan ihtiyacı ortadan kaldırmak için hiç güncellenmedi. Diğer daha önemli uyarıların fark edilmesi ve düzeltilmesi için bu uyarıların bastırılması gereklidir.

Diğer uyarıların bastırılması durumunda, hala biraz gri bir alanda.


Güncelleme # 2

Gereğince Oracle Dokümanlar (ayrıca aşağıda bazı cevaplar tarafından bahsedilen):

Bir stil meselesi olarak, programcılar bu ek açıklamayı her zaman etkili olduğu en derin yuvalanmış öğede kullanmalıdır. Belirli bir yöntemde bir uyarıyı bastırmak istiyorsanız, sınıfından ziyade bu yönteme açıklama eklemeniz gerekir.



@gnat Kontrol edilmeyen tip oyuncular hakkında konuşmuyorlar
Bilesh Ganguly

1
yaptıkları : "Birçok vazgeçilmez Java kütüphaneleri güvensiz tipleştiriyor ihtiyacını ortadan kaldırmak için güncellendi asla bu diğer daha önemli uyarılar fark ve düzeltilecektir yüzden bu uyarıları Bastırma gereklidir.".
gnat

2
Bu yinelenen sorun C # ile ilgili olduğunu düşünüyorum - derleyici uyarıları bastırmak genel fikrinden farklı bazı Java'ya özgü nedenler vardır.

Yanıtlar:


26

Bana göre, uyarıları bastırmanın tüm amacı, projeniz için "temiz bir sağlık tasarısı" korumaktır. Kod tabanınızın tamamının temiz bir şekilde derlendiğini biliyorsanız, biri ilk sorunun uyarı listesinde görünmesine neden olan yanlış bir şey yaptığında hemen belli olur. Daha sonra hatayı düzeltebilir veya sahte olduğunu kanıtlayabilirseniz bastırabilirsiniz.

Ancak orada başlamak için 21 uyarınız varsa, biri neden olduğunda 22. uyarıyı görmezden gelmeniz ve zararsız olup olmadığını kontrol etmemeniz daha olasıdır . Bu, sorunların kod tabanınıza sızabileceği ve asla fark etmeyeceğiniz anlamına gelir.

Uyarılar yararlı bilgi öğeleridir. Gerçeği konuşanlara dikkat ettiğinizden ve konuşmayanları filtrelediğinizden emin olun. İnsanların iki türden gelmesine izin vermeyin, böylece erken uyarı sisteminizi kaybedersiniz.

Düzenle

Muhtemelen değeri olan bir uyarıyı bastırmanın aptalca bir şey olduğunu açıklığa kavuşturmalıyım . Hile yaparak elde ettiğiniz temiz bir sağlık faturası kesinlikle değmez. Seçim göz önüne alındığında, derleyicinin fark ettiği sorunu her zaman gözlerinizi kapatmak yerine düzeltmeniz gerekir. Ancak, derleyicinin bir şeyin sorun olup olmayacağından emin olamadığı alanlar vardır (Java'nın jenerikleri böyle bir alandır) ve her bir örneği incelemek ve daha sonra bu belirli yerde uyarıyı bastırmak daha iyi bir seçimdir. Bu uyarı sınıfını tamamen kapatmak ve gerçek bir uyarıyı kaçırmaktan daha fazlasıdır.


1
Kısmen, "temiz" bir listeden başlamanın daha sonraki uyarıları yakalamanıza yardımcı olduğunu kabul ediyorum, gerçek şu ki, temiz bir şekilde derlenen kod temiz çalışmayabilir.
user949300

İş yerinde yaşadığım sorun, sık sık başkalarının bastırdığı uyarılarla karşılaşmam, çünkü ne dediğini anlamadılar. Bu yüzden bir uyarının liyakatinin olup olmadığı öznel bir konudur. : /
Trejkaz

16

Uyarıları bastırmak, çok dikkatli bir şekilde yapılması gereken bir şeydir.

Uyarı şu anlama gelir: Derleyici çok tehlikeli görünüyor. Bu çok tehlikeli olduğu anlamına gelmez , sadece derleyiciye benziyor. Bazen mükemmel olan ve uyarı veren bir kodunuz olabilir. Bazen kodunuzu biraz değiştirerek düzeltirsiniz. Bazen derleyici özellikle bu amaç için bazı özelliklere sahiptir. Örneğin nerede

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

uyarı veriyor ama

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

yapmaz. İlk durumda, = değil, == demek istediğinizi varsayan bir uyarı. İkinci durumda uyarı yok çünkü fazla parantez derleyiciye "Ne yaptığımı biliyorum" der. Elbette daha iyisi

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

veya iki satır kullanarak.

Ve bazen, çok nadiren, kodunuzun iyi olduğu durumlar vardır, ancak bunu uyarı yapmadan kabul edilen bir şekilde yazmayı başaramazsınız. Bu çok nadir durumlarda, söz konusu ifade için bir uyarıyı devre dışı bırakır ve hemen ardından açarsınız. Bu son çare. Ve sadece bu uyarıyı devre dışı bırakırsınız, başkalarını değil.

Bununla birlikte, bazı insanlar uyarılardan kurtulmak için uyarıları devre dışı bırakır, çünkü önce meşru bir uyarının nedenini bulmak ve düzeltmek için çok tembeller. Veya uyarı içermeyen bir kod yazmaya bile çalışmazlar. Bu son derece sağlıksız bir şey.


2
Sanırım ikinci ve üçüncü örneklerinizde kapanış parantezi eksik olabilir.
8bittree

1
Son cümle ile mükemmel bir şekilde anlaştı
usr-local-ΕΨΗΕΛΩΝ

7

Tüm bir yöntem için uyarıyı bastırmak şüphelidir. Bir yorum ile belirli bir çizgi için uyarıları bastırmak daha iyidir . Örneğin

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.