2012-12-28 12 views
228

मैं जावा में कुछ विधि देखा के रूप में घोषित:@Nullable एनोटेशन उपयोग

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

@Nullable यहाँ का अर्थ क्या है? क्या इसका मतलब है कि इनपुट null हो सकता है? एनोटेशन के बिना, इनपुट अभी भी शून्य हो सकता है, तो मुझे लगता है कि यह सिर्फ इतना नहीं है?

धन्यवाद

+2

नीचे दिए गए उत्तरों से, मैंने सीखा है कि एनोटेशन इंगित करता है कि शून्य मान स्वीकार्य हैं, इसका उपयोग कहां किया जाता है, कोड विश्लेषक मैं कोशिश कर सकता हूं और व्याख्याएं भिन्न हो सकती हैं। देखें कि यह प्रारूप एक अच्छा क्यों है? पूरे दौर में, विशेष रूप से इस सवाल पूछने के लिए। – icedwater

+2

कौन सा लाइब्रेरी आपके प्रश्न के संदर्भ में '@ Nullable' प्रदान कर रही है? क्या यह [परीक्षक?] (Https://checkerframework.org/manual/#nullness-checker) – 8bitjunkie

उत्तर

252

यह स्पष्ट करता है कि विधि शून्य मान स्वीकार करता है, और यदि आप विधि ओवरराइड, आप भी शून्य मान स्वीकार करना चाहिए कि बनाता है।

यह FindBugs जैसे कोड विश्लेषकों के संकेत के रूप में भी कार्य करता है। उदाहरण के लिए, यदि ऐसी विधि बिना किसी शून्य की जांच किए इसके तर्क को अस्वीकार करती है, तो FindBugs चेतावनी को छोड़ देगा।

+9

http://findbugs.sourceforge.net/ – MrSmith42

64

यह एनोटेशन आमतौर पर NullPointerExceptions को खत्म करने के लिए उपयोग किया जाता है। @Nullable अक्सर कहता है कि यह पैरामीटर null हो सकता है। इस तरह के व्यवहार का अच्छा उदाहरण Google Guice में पाया जा सकता है। इस हल्के निर्भरता इंजेक्शन ढांचे में आप बताते हैं कि यह निर्भरता null हो सकती है। यदि आप null पास करने की कोशिश करेंगे और एनोटेशन के बिना ढांचा इसे काम करने से इनकार कर देगा।

@Nullable@NotNull एनोटेशन के साथ और अधिक उपयोग किया जा सकता है। यहां आप find कुछ सुझावों का उपयोग कैसे कर सकते हैं। IntelliJ में कोड निरीक्षण एनोटेशन की जांच करता है और कोड को डीबग करने में मदद करता है।

6

@Nullable दावों के साथ एनोटेट किया गया तत्व दावा करता है कि शून्य मान वापस (विधियों के लिए) के लिए मान्य है, पैरामीटर के लिए (स्थानीय चर और क्षेत्रों के लिए) पास करें।

@NotNull दावों के साथ एनोटेटेड तत्व (दावों के लिए), पैरामीटर के लिए (पैरामीटर के लिए) पास करने के लिए प्रतिबंधित है (स्थानीय चर और फ़ील्ड के लिए)।

एनोटेटेड घोषणा या पैरामीटर के साथ विधियों को ओवरराइड/कार्यान्वित करते समय @Nullable और @NotNull के बीच एक संवैधानिक-विरोधी संबंध है।

अधिभावी/व्याख्या किए गए घोषणा के साथ तरीकों को लागू करने:

  • माता पिता विधि के @NotNull एनोटेशन बच्चे वर्ग विधि के लिए
    @NotNull एनोटेशन की आवश्यकता है।
  • माता पिता विधि में @Nullable टिप्पणी के साथ तरीके बच्चे वर्ग विधि में या तो @Nullable या @NotNull एनोटेशन हो सकता है।

अधिभावी/एनोटेट मानकों के साथ तरीकों को लागू करने:

  • माता पिता विधि में पैरामीटर के @Nullable एनोटेशन बच्चे वर्ग विधि पैरामीटर के लिए @Nullable एनोटेशन की आवश्यकता है।
  • माता पिता विधि में पैरामीटर के @NotNull टिप्पणी के साथ तरीके या तो @Nullable या @NotNull एनोटेशन (या कोई भी उनमें से ) बच्चे वर्ग विधि पैरामीटर के लिए हो सकता है।

उदाहरण:

@Nullable 
public static UserContext getThreadUserContext() { 
    TransactionParms tp = TransactionParms.getBoundParms(); 
    return (tp == null) ? null : tp.getUserContext(); 
} 

यहाँ getThreadUserContext विधि TransactionParms का एक उदाहरण वापस जाने के लिए है। Bu उस उदाहरण को Null

संबंधित मुद्दे