2012-09-06 10 views
34

दोनों के बीच क्या अंतर है? दोनों का मतलब यह है कि मान शून्य हो सकता है और तदनुसार निपटाया जा सकता है जैसा कि शून्य के लिए चेक किया गया है।javax.annotation: @Nullable बनाम @ चेकफ़ोरनुल

अद्यतन: दो एनोटेशन ऊपर JSR-305 का हिस्सा हैं/FindBugs: http://findbugs.sourceforge.net/manual/annotations.html

+0

मुझे नहीं लगता कि उन टिप्पणियां जावा बीन सत्यापन के एपीआई से आती हैं। आप किस पुस्तकालय/ढांचे का उपयोग कर रहे हैं? क्या इसकी टिप्पणियों के लिए दस्तावेज नहीं है? –

+0

न तो एक नियमित जावा एपीआई का हिस्सा लगता है। वे कहां लागू किए गए हैं? – vainolo

+0

विवरण अद्यतन किया गया। यह जेएसआर -305 का हिस्सा है और मैं जिस कार्यान्वयन का उपयोग कर रहा हूं वह FindBugs है। – vitaly

उत्तर

27

मुझे लगता है कि यह लिंक आपके द्वारा जोड़ी से बहुत स्पष्ट है: यदि आप @CheckForNull का उपयोग करें और कोड का उपयोग करता है मान null के लिए जांच नहीं करता है, FindBugs इसे एक त्रुटि के रूप में दिखाएगा।

FindBugs @Nullable को अनदेखा कर देगा।

अभ्यास में यह एनोटेशन केवल NonNull एनोटेशन को ओवरराइड करने के लिए उपयोगी है।

मामलों में @CheckForNull का उपयोग करें जब मूल्य हमेशा जांचना चाहिए। @Nullable का उपयोग करें जहां null ठीक हो सकता है।

संपादित करें: ऐसा लगता है कि @CheckForNull इस समय अच्छी तरह से समर्थित नहीं है, इसलिए मैं इसे टालने का सुझाव देता हूं और @NonNull (Which @NotNull Java annotation should I use? भी देखता हूं) का उपयोग करता हूं। एक और विचार सीधे FindBugs डेवलपर्स के संपर्क में रहना होगा, और दस्तावेज़ीकरण में असंगतता के बारे में उनकी राय पूछना होगा।

+0

अलेक्जेंडर के उत्तर से कोड चलाने के बाद FindBugs से मिली एकमात्र चेतावनी 'nonnull() शून्य हो सकती है, लेकिन घोषित की जाती है @NonNull पर test.java:[line 19] विधि com.db.icestation.test में।nonnull() ' बग विवरण है 'विधि शून्य वापस आ सकती है, लेकिन @NonNull घोषित की गई है। यह विधि एक शून्य मान वापस कर सकती है, लेकिन विधि (या एक सुपरक्लास विधि जो इसे ओवरराइड करता है) को @NonNull लौटने के लिए घोषित किया जाता है। बग प्रकार और पैटर्न: एनपी - एनपी_एनओएनएनयूएलएलएक्स_विओलेशन ' – vitaly

+0

मुझे FindBugs में एक बग जैसा लगता है ... – lbalazscs

+0

मुझे यहां @ चेकफ़ोरनुल का कोई उल्लेख नहीं मिल रहा है: http://findbugs.sourceforge.net/bugDescriptions.html (@NonNull वहां है) – vitaly

9

@Nonnull और @Nullable इंटेलिजे आईडीईए द्वारा सही तरीके से संभाला जाता है। FindBugs को @Nonnull के साथ समस्या मिली लेकिन @Nullable और @CheckForNUll के लिए उनको याद किया। आईडीईए और फाइंडबग द्वारा खोजी गई समस्याओं को टिप्पणियों के साथ चिह्नित किया गया है।

package com.db.icestation; 

import javax.annotation.CheckForNull; 
import javax.annotation.Nonnull; 
import javax.annotation.Nullable; 

public class test { 

    public @Nullable String nullable() { 
     return ""; 
    } 
    public @Nonnull String nonnull() { 
     return null; // IDEA, findbugs 
    } 
    public @CheckForNull String checkForNull() { 
     return null; 
    } 

    public static void main(String[] args) { 
     System.out.println(new test().nullable().length()); // IDEA 
     System.out.println(new test().nonnull().length()); 
     System.out.println(new test().checkForNull().length()); 
    } 
} 
+0

ग्रहण बिल्कुल वही मिलता है, ** बशर्ते कि ** इसे 'शून्य विश्लेषण' करने के लिए कॉन्फ़िगर किया गया है और सही एनोटेशन का उपयोग करता है (डिफ़ॉल्ट रूप से यह जेडीटी एनोटेशन का उपयोग करता है और जेएसआर -305 नहीं)। दिलचस्प बात यह है कि @CheckForNull एनोटेशन के लिए कोई कॉन्फ़िगरेशन नहीं है (लेकिन इसमें @NonNullByDefault है)। – vitaly

+1

FindBugs 2.0.1 '@ CheckForNull' केस का पता लगाता है:" संभावित विधि के वापसी मूल्य के कारण संभव शून्य सूचकता। " –

+0

@ डेविड हार्नेस - मैं इसे 2.0.1 का उपयोग करके पुन: पेश नहीं कर सकता: https://github.com/lischenko/flaming-ninja (findbugs.null.analysis देखें)। findbugs-maven-plugin = v2.5.2 - नवीनतम, एनोटेशन = 2.0.1 – vitaly

3

IntelliJ विचार @javax.annotation.Nullable में भिन्नता के लिए डिफ़ॉल्ट और किसी भी प्रयास का समर्थन प्राप्त @Nullable बहस या वापसी मान चेतावनी में परिणाम होगा है।

@ एलेक्सेंडर-पावलोव, आप "निरंतर स्थितियों & अपवाद" निरीक्षण के कॉन्फ़िगरेशन में @javax.annotation.CheckForNull जोड़ सकते हैं। फ़ाइल पर जाएं-> सेटिंग्स-> निरीक्षण-> संभावित बग-> लगातार स्थितियां & अपवाद-> एनोटेशन कॉन्फ़िगर करें।

मैं इसे @CheckForNull के रूप में करना पसंद करता हूं @Nullable से अधिक स्पष्ट अर्थ है जैसा कि ऊपर दिए गए उत्तर में उल्लिखित @lbalazscs है।

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