एक उदाहरण "नकार" करने का सबसे अच्छा तरीका


409

मैं सोच रहा था कि क्या वहाँ एक बेहतर / अच्छे तरीके से मौजूद है एक नकारात्मक instanceof जावा में । दरअसल, मैं कुछ ऐसा कर रहा हूं:

if(!(str instanceof String)) { /* do Something */ }

लेकिन मुझे लगता है कि ऐसा करने के लिए एक "सुंदर" सिंटैक्स मौजूद होना चाहिए।

किसी को पता है अगर यह मौजूद है, और वाक्यविन्यास कैसा दिखता है?


संपादित करें: सुंदर द्वारा, मैं कुछ इस तरह कह सकता हूं:

if(str !instanceof String) { /* do Something */ } // compilation fails

24
मैं बहुत से पहले के नियमों से नफरत करता हूँ instanceof...
luiscubal

4
आप हमेशा एक चर बना सकते हैं, कुछ इस तरह boolean strIsString = str instanceof String;...
vaughandroid

हाँ, @ बक्वेटा, एक विकल्प है। लेकिन, एक सिंटेक्स या अन्य में मेमोरी के उपयोग में क्या अंतर हो सकता है?
caarlos0

2
यह कैसी रचनात्मक टिप्पणी है?
Louth

2
जावा निर्माता एक नया कीवर्ड पेश कर सकते हैं: notinstanceof । बस मेरे दो सेंट ^ ^
Stephan

जवाबों:


308

नहीं, कोई बेहतर तरीका नहीं है; तुम्हारा विहित है।


132

मुझे नहीं पता कि जब आप "सुंदर" कहते हैं तो आप क्या कल्पना करते हैं, लेकिन इस बारे में क्या? मुझे लगता है कि यह आपके द्वारा पोस्ट किए गए क्लासिक रूप से भी बदतर है, लेकिन किसी को यह पसंद आ सकता है ...

if (str instanceof String == false) { /* ... */ }

2
दोहरे तर्क के बारे में, आप != trueइसके बदले उपयोग कर सकते हैं == false: D
jupi

यह देखने से मुझे यह समझने में मदद मिलती है कि if(!(str instanceof String)) यह एकमात्र तरीका है, और मुझे सोचने के विकल्प को रोकने की आवश्यकता है
विकाश

मुझे यह समाधान पसंद है क्योंकि मुझे इसे पढ़ते समय धातु के ढेर का निर्माण करने की आवश्यकता नहीं है!
12:00 पर JaM

59

आप इस Class.isInstanceविधि का उपयोग कर सकते हैं :

if(!String.class.isInstance(str)) { /* do Something */ }

... लेकिन यह अभी भी नकारात्मक और बहुत बदसूरत है।


5
थोड़ा बेहतर है, अतिरिक्त कोष्ठक कोड को बदसूरत बनाता है, IMHO।
caarlos0

क्या यह बहुत धीमा नहीं है?
मैक्सममन

4
यह अलग व्यवहार है। Instof कीवर्ड में उपवर्ग शामिल हैं, विधि नहीं है, आपको व्यवहार को दोहराने के लिए Class.isAssignableFrom का उपयोग करने की आवश्यकता है।
क्रिस कूपर

7
@ क्रिसहॉपर यह सच नहीं है:this method returns true if the specified Object argument is an instance of the represented class (or of any of its subclasses)
नैटिक्स

24

आमतौर पर आप सिर्फ ifएक elseखंड के रूप में अच्छी तरह से नहीं चाहते हैं ।

if(!(str instanceof String)) { /* do Something */ } 
else { /* do something else */ }

के रूप में लिखा जा सकता है

if(str instanceof String) { /* do Something else */ } 
else { /* do something */ }

या आप कोड लिख सकते हैं ताकि आपको यह जानने की आवश्यकता न हो कि इसकी स्ट्रिंग है या नहीं। जैसे

if(!(str instanceof String)) { str = str.toString(); } 

के रूप में लिखा जा सकता है

str = str.toString();

12

यदि आप स्थैतिक आयात का उपयोग कर सकते हैं, और आपका नैतिक कोड उन्हें अनुमति देता है

public class ObjectUtils {
    private final Object obj;
    private ObjectUtils(Object obj) {
        this.obj = obj;
    }

    public static ObjectUtils thisObj(Object obj){
        return new ObjectUtils(obj);
    }

    public boolean isNotA(Class<?> clazz){
        return !clazz.isInstance(obj);
    }
}

और तब...

import static notinstanceof.ObjectUtils.*;

public class Main {

    public static void main(String[] args) {
        String a = "";
        if (thisObj(a).isNotA(String.class)) {
            System.out.println("It is not a String");
        }
        if (thisObj(a).isNotA(Integer.class)) {
            System.out.println("It is not an Integer");
        }
    }    
}

यह सिर्फ एक धाराप्रवाह इंटरफ़ेस अभ्यास है, मैं वास्तविक जीवन कोड में कभी भी इसका उपयोग नहीं करूँगा!
अपने क्लासिक तरीके के लिए जाओ, यह आपके कोड को पढ़ने वाले किसी और को भ्रमित नहीं करेगा!


मुझे स्थैतिक आयात पसंद नहीं है .. वैसे भी मदद के लिए धन्यवाद :)
caarlos0

4

यदि आपको यह अधिक समझ में आता है, तो आप जावा 8 के साथ कुछ ऐसा कर सकते हैं:

public static final Predicate<Object> isInstanceOfTheClass = 
    objectToTest -> objectToTest instanceof TheClass;

public static final Predicate<Object> isNotInstanceOfTheClass = 
    isInstanceOfTheClass.negate(); // or objectToTest -> !(objectToTest instanceof TheClass)

if (isNotInstanceOfTheClass.test(myObject)) {
    // do something
}

1
जावा 11 के साथ, यह काम करना चाहिए if (Predicate.not(isInstanceOfTheClass).test(myObject)) { ...। बेहतर नहीं, इमो, लेकिन काम करना चाहिए!
पैट्रिक एम

3

ठीक है मेरे दो सेंट, एक स्ट्रिंग विधि का उपयोग करें:

public static boolean isString(Object thing) {
    return thing instanceof String;
}

public void someMethod(Object thing){
    if (!isString(thing)) {
        return null;
    }
    log.debug("my thing is valid");
}

0

आप नीचे दिए गए तरीके से प्राप्त कर सकते हैं .. बस कंडक्टर if(!(condition with instanceOf))को पूरी शर्त के साथ जोड़कर एक शर्त जोड़ सकते हैं !, शुरू में ऑपरेटर को नीचे दिए गए कोड स्निपेट में बताए गए तरीके से जोड़कर ।

if(!(str instanceof String)) { /* do Something */ } // COMPILATION WORK

के बजाय

if(str !instanceof String) { /* do Something */ } // COMPILATION FAIL

0

मैं मानता हूं कि ज्यादातर मामलों में सबसे if (!(x instanceof Y)) {...}अच्छा तरीका है, लेकिन कुछ मामलों में एक isY(x)फ़ंक्शन बनाना ताकि आप if (!isY(x)) {...}सार्थक हो सकें ।

मैं एक टाइपस्क्रिप्ट नौसिखिया हूं, और मैंने पिछले कुछ हफ्तों में इस एस / ओ सवाल का एक गुच्छा से टकराया है, इसलिए गुग्लर्स के लिए टाइपस्क्रिप्ट तरीका ऐसा करने के लिए एक प्रकार का गार्ड बनाने के लिए है:

typeGuards.ts

export function isHTMLInputElement (value: any): value is HTMLInputElement {
  return value instanceof HTMLInputElement
}

प्रयोग

if (!isHTMLInputElement(x)) throw new RangeError()
// do something with an HTMLInputElement

मैं एकमात्र कारण अनुमान लगाता हूं कि यह टाइपस्क्रिप्ट में उचित क्यों हो सकता है और नियमित js नहीं है कि टाइपगार्ड एक सामान्य सम्मेलन है, इसलिए यदि आप उन्हें अन्य इंटरफेस के लिए लिख रहे हैं, तो उन्हें कक्षाओं के लिए भी लिखना उचित / समझदार / स्वाभाविक है।

डॉक्स में उपयोगकर्ता परिभाषित प्रकार के गार्ड के बारे में अधिक विवरण है

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