เป็นวิธีปฏิบัติที่ดีในการใช้คำเตือนในรหัสของคุณหรือไม่?


11

ฉันใช้@SuppressWarnings("unchecked")และ@SuppressWarnings("null")ส่วนใหญ่วิธีการข้างต้นเพื่อให้รหัสรวบรวมโดยไม่มีคำเตือนใด ๆ แต่ฉันมีข้อสงสัยของฉัน พบคำถาม Stackoverflow นี้ Jon Skeet เขียนคำตอบที่ฉันพบว่าน่าสนใจ

ตามที่เขาพูด

บางครั้ง generics Java ก็ไม่ยอมให้คุณทำสิ่งที่คุณต้องการและคุณต้องบอกคอมไพเลอร์อย่างมีประสิทธิภาพว่าสิ่งที่คุณทำจริงๆจะถูกกฎหมายในเวลาดำเนินการ

แต่ถ้ามีโอกาสที่ข้อยกเว้นจะถูกโยนทิ้งไปล่ะ? การระงับคำเตือนเป็นความคิดที่ไม่ดีใช่ไหม ฉันไม่ควรทราบเกี่ยวกับสถานที่ซึ่งปัญหาอาจปรากฏหรือไม่

นอกจากนี้จะเกิดอะไรขึ้นถ้ามีคนอื่นแก้ไขโค้ดของฉันในภายหลังและเพิ่มฟังก์ชันการทำงานที่น่าสงสัยโดยไม่ลบ SuppressWarnings จะสามารถหลีกเลี่ยงและ / หรือมีทางเลือกอื่นในการนี้ได้อย่างไร?

ฉันควรจะใช้@SuppressWarnings("unchecked")และ@SuppressWarnings("null")?


อัปเดต # 1

เท่าที่ประเภทที่ไม่ได้เลือกได้ปลดเปลื้องไปตามคำตอบนี้(ชี้ให้เห็นโดย @gnat ในความคิดเห็นด้านล่าง) การปราบปรามคำเตือนเหล่านี้เป็นสิ่งที่จำเป็น

ห้องสมุด Java ที่ขาดไม่ได้หลายแห่งไม่เคยมีการอัพเดทเพื่อกำจัดความต้องการ typecasts ที่ไม่ปลอดภัย การระงับคำเตือนเหล่านั้นเป็นสิ่งที่จำเป็นเพื่อให้คำเตือนที่สำคัญอื่น ๆ จะได้รับการสังเกตและแก้ไข

ในกรณีที่มีการระงับคำเตือนอื่น ๆ ยังคงอยู่ในพื้นที่สีเทาเล็กน้อย


อัปเดต # 2

ตามเอกสาร Oracle (กล่าวถึงบางคำตอบด้านล่าง):

โปรแกรมเมอร์ควรใช้คำอธิบายประกอบนี้กับองค์ประกอบที่ซ้อนกันมากที่สุดซึ่งมีประสิทธิภาพ หากคุณต้องการระงับคำเตือนในวิธีใดวิธีหนึ่งคุณควรใส่คำอธิบายประกอบวิธีนั้นแทนการเรียน



@gnat พวกเขาไม่ได้พูดถึงนักแสดงประเภทไม่ จำกัด
Bilesh Ganguly

1
พวกเขาทำ : "ห้องสมุด Java ที่ขาดไม่ได้หลายแห่งไม่เคยได้รับการปรับปรุงเพื่อกำจัดความต้องการ typecasts ที่ไม่ปลอดภัยการยับยั้งคำเตือนเหล่านั้นเป็นสิ่งที่จำเป็นเพื่อให้คำเตือนที่สำคัญอื่น ๆ
ริ้น

2
ฉันคิดว่าปัญหาของการทำซ้ำนั้นเป็นเรื่องเกี่ยวกับ C # - มีเหตุผลบางอย่างเกี่ยวกับ Java ที่แตกต่างจากแนวคิดทั่วไปของการระงับคำเตือนคอมไพเลอร์

คำตอบ:


26

สำหรับฉันประเด็นทั้งหมดของการระงับคำเตือนคือการรักษา "ค่ารักษาความสะอาดของสุขภาพ" สำหรับโครงการของคุณ หากคุณรู้ว่าฐานรหัสทั้งหมดของคุณรวบรวมได้อย่างชัดเจนจะเห็นได้ชัดทันทีเมื่อมีคนทำอะไรผิดพลาดซึ่งเป็นสาเหตุให้คำเตือนครั้งแรกปรากฏในรายการปัญหา จากนั้นคุณสามารถแก้ไขข้อผิดพลาดหรือระงับได้หากคุณพิสูจน์ได้ว่าเป็นของปลอม

แต่ถ้าคุณมีคำเตือน 21 ข้อเพื่อเริ่มต้นมันมีแนวโน้มที่คุณจะมองข้ามคำเตือนที่ 22 เมื่อมีคนทำและคุณไม่ได้ตรวจสอบว่าไม่มีอันตราย นั่นหมายความว่าปัญหาสามารถคืบคลานเข้าสู่ฐานรหัสของคุณและคุณจะไม่สังเกตเห็น

คำเตือนเป็นรายการข้อมูลที่มีประโยชน์ ตรวจสอบให้แน่ใจว่าคุณใส่ใจคนที่พูดความจริงและกรองคนที่ไม่พูดออกไป อย่าปล่อยให้คนรวมสองประเภทนี้เพื่อที่คุณจะได้สูญเสียระบบเตือนภัยล่วงหน้า

แก้ไข

ฉันควรจะชี้แจงว่าการระงับคำเตือนที่ไม่มีบุญเป็นเรื่องโง่ ๆ ที่ต้องทำ สุขภาพที่ดีที่คุณได้รับจากการโกงนั้นไม่มีค่าอะไรเลย เมื่อเลือกแล้วคุณควรแก้ไขปัญหาที่คอมไพเลอร์สังเกตเห็นแทนที่จะปิดตา อย่างไรก็ตามมีบางพื้นที่ที่คอมไพเลอร์ไม่สามารถแน่ใจได้ว่าจะมีปัญหาหรือไม่ (generics ของ Java เป็นหนึ่งในพื้นที่ดังกล่าว) และมีทางเลือกที่ดีกว่าคือการตรวจสอบแต่ละอินสแตนซ์แล้วระงับคำเตือนในสถานที่นี้โดยเฉพาะ กว่าจะปิดการเตือนระดับนี้ไปพร้อมกันและอาจพลาดคำเตือนของแท้


1
ฉันยอมรับบางส่วนที่เริ่มต้นจากกระดานชนวน "สะอาด" ช่วยให้คุณตรวจจับคำเตือนในภายหลังความจริงก็คือรหัสที่คอมไพล์อย่างหมดจดอาจไม่ทำงานอย่างหมดจด
949300

ปัญหาที่ฉันมีในที่ทำงานคือฉันมักจะพบกับคำเตือนที่คนอื่นระงับเพราะพวกเขาไม่เข้าใจสิ่งที่พูด ดังนั้นฉันเดาว่าคำเตือนมีข้อดีคือเรื่องส่วนตัวหรือไม่ : /
Trejkaz

16

การยับยั้งการเตือนเป็นสิ่งที่ต้องทำด้วยความระมัดระวัง

คำเตือนหมายถึง: คอมไพเลอร์พบบางสิ่งที่ดูหลบ มันไม่ได้หมายความว่ามันเป็นหลบมันก็ดูเหมือนว่ามันจะคอมไพเลอร์ บางครั้งคุณมีรหัสที่ดีอย่างสมบูรณ์และให้คำเตือน บางครั้งคุณแก้ไขได้ด้วยการแก้ไขรหัสของคุณเล็กน้อย บางครั้งคอมไพเลอร์มีคุณสมบัติบางอย่างโดยเฉพาะสำหรับวัตถุประสงค์นั้น ตัวอย่างเช่นที่ไหน

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

ให้คำเตือน แต่

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

ไม่ ในกรณีแรกคำเตือนสมมติว่าคุณอาจหมายถึง == และไม่ = ในกรณีที่สองไม่มีคำเตือนเพราะวงเล็บพิเศษบอกคอมไพเลอร์ "ฉันรู้ว่าฉันกำลังทำอะไร" แน่นอนว่าจะดีกว่า

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

หรือใช้สองบรรทัด

และบางครั้งไม่ค่อยมีกรณีเมื่อรหัสของคุณดี แต่คุณไม่สามารถจัดการในการเขียนวิธีที่ยอมรับโดยไม่มีการเตือน ในกรณีที่หายากมากนั้นคุณปิดการเตือนสำหรับคำสั่งนั้นและเปิดมันทันทีหลังจากนั้น นั่นเป็นทางเลือกสุดท้าย และคุณปิดใช้งานการเตือนเฉพาะนั้นเท่านั้นไม่มีผู้อื่น

อย่างไรก็ตามบางคนเพียงปิดการใช้งานคำเตือนเพื่อกำจัดคำเตือนเพราะพวกเขาขี้เกียจเกินกว่าที่จะค้นหาและแก้ไขสาเหตุของคำเตือนที่ถูกกฎหมายก่อน หรือแม้แต่พยายามเขียนโค้ดที่ไม่มีคำเตือน นั่นเป็นสิ่งที่ไม่ดีต่อสุขภาพอย่างมาก


2
ฉันคิดว่าคุณอาจไม่มีวงเล็บปิดในตัวอย่างที่สองและสามของคุณ
8bittree

1
เห็นด้วยอย่างสมบูรณ์แบบด้วยประโยคสุดท้าย
usr-local-ΕΨΗΕΛΩΝ

7

การระงับคำเตือนสำหรับวิธีการทั้งหมดเป็นที่น่าสงสัย ดีกว่าที่จะปราบปรามคำเตือนสำหรับสายเฉพาะที่มีการแสดงความคิดเห็น เช่น

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.