मुझे लगता है कि देख सकते हैं @Nullable
और @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
। बेशक, जावा 7 में एक एनोटेशन के साथ कास्टिंग संभव नहीं है, लेकिन जावा 8 एक चर के उपयोग के लिए एनोटेशन को लागू करने की क्षमता को शामिल करेगा, जिसमें कलाकार भी शामिल हैं। इसलिए यह जावा 8. में लागू होने के लिए संभव हो सकता है
(@NonNull Integer) y
का निर्माण संभव रूप से संभव है, लेकिन एक संकलक को एनोटेशन के आधार पर किसी विशिष्ट बाइट कोड का उत्सर्जन करने की अनुमति नहीं है। रनटाइम अभिकथन के लिए बग हेलिकॉप्टर विधियाँ पर्याप्त हैं जैसा कि Bugs.eclipse.org/442103 (जैसे, directPathToA(assertNonNull(y))
) में चर्चा की गई है - लेकिन आपको लगता है, यह केवल तेजी से विफल होने में मदद करता है। एकमात्र सुरक्षित तरीका एक वास्तविक अशक्त जांच (प्लस शाखा में वैकल्पिक रूप से वैकल्पिक कार्यान्वयन) है।
@Nullable
या नहीं@Nonnull
, लेकिन अगर वे इसके लायक हैं, तो "बहस की संभावना" बहुत है