java.util.Objects.isNull बनाम वस्तु == अशक्त


87

जैसा कि आप जानते हैं, java.util.Objectsहै

इस वर्ग में वस्तुओं के संचालन के लिए स्थैतिक उपयोगिता के तरीके शामिल हैं।

इस तरह के तरीकों में से एक है Objects.isNull()

मेरी समझ यह है कि Objects.isNull()गलती से दूसरे को छोड़ कर ऑब्जेक्ट को अशक्त मान देने का मौका हटा दिया जाएगा =

हालाँकि, एपीआई नोट बताता है:

इस विधि को एक विधेय, फ़िल्टर (ऑब्जेक्ट :: isNull) के रूप में उपयोग करने के लिए मौजूद है

किसी भी कारण से / परिस्थिति है जिसके लिए मैं का उपयोग करना चाहिए होगा object == nullसे अधिक Objects.isNull()एक में अगर बयान ?

Objects.isNull()केवल विशेष रूप से विधेय तक सीमित होना चाहिए?


3
यदि आप चिंता कर रहे हैं तो आकस्मिक असाइनमेंट है, आप बस if(null == variable)लगातार उपयोग कर सकते हैं ...
होल्गर

1
@ फ़ोल्डर, किस आकस्मिक कार्य के बारे में चिंता करने की ज़रूरत है? यह जावा है। आपको एक प्रकार की त्रुटि मिलेगी।
लुई वासरमैन

1
@LouisWasserman नहीं तो variableक्या है Boolean
एलेक्सिस सी।

2
@AlexisC, यह एक छोटे, छोटे मामलों में एक चिंता का विषय होगा : आपके चर को बहुत विशिष्ट प्रकार का होना चाहिए, और आपको एक बहुत ही विशिष्ट टाइपो बनाना होगा, और आप किसी भी आईडीई या कंपाइलर विश्लेषण का उपयोग नहीं कर सकते। यह इंगित करेगा कि आपके लिए (लगभग सभी आईडीई के रूप में)। मैं काफी सहज हूं कि मुझे उस मामले की चिंता नहीं है।
लुई वासरमैन

1
काम पर, मैंने अशक्त == वस्तु के कई उदाहरण देखे हैं । जब मैंने पूछताछ की, तो मुझे बताया गया कि यह आकस्मिक अशक्त कार्यों को रोकने के लिए था। यहां दी गई टिप्पणियों और उत्तरों के आधार पर, मैं यह मानना ​​चाहूंगा कि यह स्वाद का एक मैटर है।
लुकास टी

जवाबों:


79

यदि एक कथन में Objects.isNull () पर ऑब्जेक्ट == नल का उपयोग करना चाहिए?

यदि आप विधि के स्रोत कोड को देखते हैं IsNull,

 /* Returns true if the provided reference is null otherwise returns false.*/

 public static boolean isNull(Object obj) {
     return obj == null;
 }

यह समान हे। इसमें कोई फर्क नही है। तो आप इसे सुरक्षित रूप से उपयोग कर सकते हैं।


14
हां, इसका उपयोग किया जा सकता है, लेकिन यह एक उपकरण द्वारा किए गए स्थानीय प्रवाह विश्लेषण में हस्तक्षेप कर सकता है। यानी, एक सादे "==" के साथ, किसी भी प्रवाह विश्लेषण से यह देखा जा सकता है कि तत्कालीन शाखा में स्थगन अच्छा नहीं है, लेकिन किसी अन्य शाखा में सुरक्षित है। आपको उपयुक्त त्रुटियां / चेतावनी या कुछ भी नहीं मिलेगा। कॉलिंग की अप्रत्यक्षता के साथ Null () है कि ज्ञान उपकरण को खो सकता है।
स्टीफन हेरमैन 10

3
वहाँ एक मामूली प्रदर्शन अंतर है। जावा के लिए ऑब्जेक्ट अशक्त संदर्भ बनाम स्टेटिक कॉलिंग की जाँच करने से अंतर होगा। और यह केवल == का उपयोग कर की तुलना में थोड़ा कम स्पष्ट रूप से पढ़ता है कि हम सभी के लिए उपयोग किया जाता है।
केविन एम।

3
में अधिक सिमेंटिक उपयोग == nullहै if, लेकिन लैंबडा एक्सप्रेशन पर उपयोग करने के लिए Null बहुत अच्छा है।
लियोनार्डो रामोस

1
यह निश्चित रूप से वैध है, लेकिन ऑपरेटरों पर इसका कोई लाभ नहीं है। इसलिए यदि आप एक टीम में काम कर रहे हैं, तो कृपया उनके इच्छित उद्देश्य के अनुसार चीजों का उपयोग करें।
एलेक्स पैनचेंको

74

Objects.isNull जावा 8 लैम्ब्डा फ़िल्टरिंग के भीतर उपयोग के लिए अभिप्रेत है।

यह लिखना बहुत आसान और स्पष्ट है:

.stream().filter(Objects::isNull) 

लिखने की तुलना में:

.stream().filter(x -> x == null).  

एक ifबयान के भीतर , हालांकि, या तो काम करेगा। इसका उपयोग == nullशायद पढ़ने में आसान है, लेकिन अंत में यह एक शैली को वरीयता देगा।


12

स्रोत को देखो:

public static boolean isNull(Object obj) {
    return obj == null;
}

nullमूल्यों की जांच करने के लिए , आप उपयोग कर सकते हैं:

  • Objects.isNull(myObject)
  • null == myObject // avoids assigning by typo
  • myObject == null // risk of typo

तथ्य यह Objects.isNullहै कि Predicateएस के लिए होता है आप इसे ऊपर के रूप में उपयोग करने से नहीं रोकते हैं।


1
टाइपो के जोखिम से आपका क्या मतलब है?
आशीष लोहिया

2
@AishishLohia के =बजाय का उपयोग करके ==(संकलन नहीं करेंगे जब तक कि यह एक अशांत Booleanआवरण नहीं है, यो निष्पक्ष रहें )
मेना

5
टाइपो का खतरा C ++ में जावा में समस्या है (यदि myObject = null) के परिणामस्वरूप संकलन त्रुटि होगी। आपको हमेशा myObject == null over null == myObject का उपयोग करना चाहिए।
टॉमस मारिक

1
@TomasMarik जैसा कि मेरी टिप्पणी में कहा गया है, टाइपो का जोखिम Booleanजावा में अशक्त आवरणों तक सीमित है । यह वास्तव में बहुत दुर्लभ है (और संकलक चेतावनी देगा जब एक असाइनमेंट nullकी जांच की जाती है जैसे कि यह एक शर्त थी), लेकिन असंभव नहीं है।
मेना

7

क्या कोई कारण / परिस्थिति होगी जिसके लिए मुझे एक कथन में Objects.isNull () पर ऑब्जेक्ट == null का उपयोग करना चाहिए ?

हां, इसका एक कारण कोड को सरल रखना है। भीतर अगर बयान object == null स्पष्ट और अच्छी तरह से जाना जाता है। यह किसी भी दुर्व्यवहार को जन्म नहीं दे सकता है यदि उदाहरण के लिए एक टाइपो है।

मेरी समझ यह है कि Objects.isNull () गलती से दूसरे को छोड़ कर ऑब्जेक्ट को अशक्त मान देने का मौका हटा देगा =।

यदि वहाँ एक if (object = null) {}साथ छोड़े गए = यह संकलन नहीं होगा या इसे करने के मामले में चेतावनी उत्पन्न होगा Booleanवस्तु! असल में वहाँ का उपयोग करने का कोई कारण नहीं है Objects.isNull(object)से अधिक object == nullके भीतर अगर बयान । यहाँ दो पक्ष अलग-अलग हैं:

if (object == null) {
}

if (Objects.isNull(object)) {
}

क्या Objects.isNull () को केवल विशेष रूप से समर्पित किया जाना चाहिए?

इसे हां कहा जा सकता है, यह विशेष रूप से Predicates तक ही सीमित है, हालांकि Objects.isNull()हर जगह उपयोग करने के लिए कोई तकनीकी बाधा नहीं है।

से public static boolean isNull(Object obj)विधि के जावाडोक:

@apiNoteThis विधि का उपयोग java.util.function.Predicate, फ़िल्टर (ऑब्जेक्ट ::Null) के रूप में किया जाता है

इसलिए यदि आप इस पद्धति का उपयोग करते हैं न कि एक विधेय के रूप में आप वास्तव में सरल की तुलना में अधिक जटिल और बोझिल अभिव्यक्ति का उपयोग कर रहे हैं object == null

यहाँ एक स्निपेट है जिसके लाभ की तुलना करना है Objects.isNull(object)

List<String> list = Arrays.asList("a", "b", null, "c", null);

// As ready-made predicate
long countNullsWithPredicate = list.stream().filter(Objects::isNull).count();

// Lambda
long countNullsWithLambda = list.stream().filter(object -> object == null).count();

// Reimplement the Objects::isNull predicate
long countNullsWithAnonymous = list.stream().filter(new Predicate<Object>() {
    @Override
    public boolean test(Object obj) {
        return obj == null;
    }
}).count();

1

शब्दार्थ में कोई अंतर नहीं है, लेकिन पठनीयता के लिए मैं निम्नलिखित ओवर पसंद करता हूं whatever == null:

import static java.util.Objects.isNull;

// Other stuff...

if(isNull(whatever)) { 

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.