ฉันเห็นว่าคำอธิบายประกอบ@Nullable
และอาจมีประโยชน์ในการป้องกันs แต่พวกเขาไม่เผยแพร่ไกลมาก@Nonnull
NullPointerException
- ประสิทธิผลของการเพิ่มความคิดเห็นเหล่านี้จะลดลงอย่างสมบูรณ์หลังจากผ่านไปหนึ่งระดับทางอ้อมดังนั้นหากคุณเพิ่มเพียงไม่กี่อย่างพวกเขาก็จะไม่เผยแพร่ไกลมากนัก
- เนื่องจากคำอธิบายประกอบเหล่านี้ไม่ได้บังคับใช้อย่างดีมีความเสี่ยงที่จะถือว่าค่าที่ทำเครื่องหมายด้วย
@Nonnull
นั้นไม่เป็นโมฆะดังนั้นจึงไม่สามารถทำการตรวจสอบโมฆะได้
โค้ดข้างล่างนี้เป็นสาเหตุของพารามิเตอร์ที่มีเครื่องหมาย@Nonnull
ที่จะเป็นnull
โดยไม่ต้องเพิ่มข้อร้องเรียนใด ๆ มันจะพ่นNullPointerException
เมื่อมันถูกเรียกใช้
public class Clazz {
public static void main(String[] args){
Clazz clazz = new Clazz();
// this line raises a complaint with the IDE (IntelliJ 11)
clazz.directPathToA(null);
// this line does not
clazz.indirectPathToA(null);
}
public void indirectPathToA(Integer y){
directPathToA(y);
}
public void directPathToA(@Nonnull Integer x){
x.toString(); // do stuff to x
}
}
มีวิธีที่จะทำให้คำอธิบายประกอบเหล่านี้มีการบังคับใช้อย่างเข้มงวดมากขึ้นและ / หรือเผยแพร่เพิ่มเติมหรือไม่
@Nonnull
เมื่อโทรหา@Nonnull
วิธีที่มีตัวแปรที่ไม่สามารถใช้ได้ แน่นอนว่าการหล่อด้วยคำอธิบายประกอบนั้นเป็นไปไม่ได้ใน Java 7 แต่ Java 8 จะเพิ่มความสามารถในการใช้คำอธิบายประกอบกับการใช้ตัวแปรรวมถึงการปลดเปลื้อง ดังนั้นนี่อาจเป็นไปได้ที่จะนำไปใช้ใน Java 8
(@NonNull Integer) y
มีความเป็นไปได้ทาง syntactically, แต่คอมไพเลอร์ไม่ได้รับอนุญาตให้ปล่อยรหัสไบต์เฉพาะใด ๆ ที่อ้างอิงจากคำอธิบายประกอบ. สำหรับวิธีการยืนยันแบบรันไทม์วิธีใช้ตัวช่วยตัวจิ๋วนั้นก็เพียงพอแล้วดังที่กล่าวไว้ในbugs.eclipse.org/442103 (เช่น, directPathToA(assertNonNull(y))
) - แต่โปรดจำไว้ว่านี่จะช่วยให้ล้มเหลวอย่างรวดเร็วเท่านั้น วิธีที่ปลอดภัยเพียงอย่างเดียวคือการตรวจสอบ null จริง (บวกกับการใช้งานทางเลือกในสาขาอื่น)
@Nonnull
และ@Nullable
คุณกำลังพูดถึงในขณะที่มีหลาย annoations คล้ายกัน (ดูคำถามนี้ ) คุณกำลังพูดถึงคำอธิบายประกอบในแพ็คเกจjavax.annotation
หรือไม่
@Nullable
หรือ@Nonnull
แต่ถ้าพวกเขามีค่ามันมาก "น่าจะเรียกร้องการอภิปราย"