@ การใช้คำอธิบายประกอบที่เป็นโมฆะ


347

ฉันเห็นวิธีการบางอย่างใน java ประกาศว่า:

void foo(@Nullable Object obj)
{ ... }

ความหมายของ@Nullableที่นี่คืออะไร? หมายความว่าอินพุตอาจเป็นได้nullหรือไม่

หากไม่มีคำอธิบายประกอบอินพุตยังคงเป็นโมฆะดังนั้นฉันเดาว่าไม่ใช่แค่นั้น


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

8
ห้องสมุดใดที่ให้บริการ@Nullableในบริบทของคำถามของคุณ มันเป็นตัวตรวจสอบ?
8bitjunkie

คำตอบ:


367

มันทำให้ชัดเจนว่าวิธีการยอมรับค่า null และถ้าคุณแทนที่วิธีคุณควรยอมรับค่า null

นอกจากนี้ยังทำหน้าที่เป็นคำแนะนำสำหรับการวิเคราะห์รหัสเหมือนFindBugs ตัวอย่างเช่นถ้าเมธอดดังกล่าวมีการโต้แย้งโดยไม่ตรวจสอบโมฆะก่อน FindBugs จะส่งคำเตือน


82

NullPointerExceptionsหมายเหตุนี้เป็นที่นิยมใช้ในการขจัด บอกว่าพารามิเตอร์นี้อาจจะมี@Nullable nullตัวอย่างที่ดีของพฤติกรรมดังกล่าวสามารถพบได้ในGoogle Guice nullในกรอบฉีดพึ่งพานี้มีน้ำหนักเบาที่คุณสามารถบอกได้ว่าการพึ่งพานี้อาจจะมี หากคุณพยายามที่จะผ่านnullโดยไม่มีคำอธิบายประกอบกรอบจะปฏิเสธที่จะทำงาน

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



1

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

public String foo(@Nullable String mayBeNothing) {
   return Optional.ofNullable(mayBeNothing).orElse("Really Nothing");
}

นอกจากนี้คุณยังสามารถโยนข้อยกเว้นบางอย่างในการมีโดยการเปลี่ยนไป.orElse orElseThrow(() -> new Exception("Dont' send a null"))

หากคุณไม่ต้องการใช้ @Nullable ซึ่งไม่เพิ่มการทำงานใด ๆ ทำไมไม่เพียงแค่ตั้งชื่อพารามิเตอร์ด้วยmayBe...เพื่อให้ความตั้งใจของคุณชัดเจน

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