একটি উদাহরণ "উপেক্ষা" করার সেরা উপায়


409

আমি ভাবছিলাম instanceofজাভাতে কোনটিকে উপেক্ষা করার জন্য আরও ভাল / ভাল উপায় আছে কিনা । আসলে, আমি এই জাতীয় কিছু করছি:

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

তবে আমি মনে করি এটি করার জন্য একটি "সুন্দর" বাক্য গঠন থাকা উচিত।

কেউ কি জানেন যে এটি বিদ্যমান আছে এবং সিনট্যাক্সটি কেমন দেখাচ্ছে?


সম্পাদনা: সুন্দর দ্বারা, আমি এই জাতীয় কিছু বলতে পারি:

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

24
আমি instanceofএত বেশি ক্ষেত্রে অগ্রাধিকারের নিয়মকে ঘৃণা করি ...
লুস্কুবাল

4
আপনি সর্বদা একটি পরিবর্তনশীল তৈরি করতে পারেন, এর মতো কিছু boolean strIsString = str instanceof String;...
ভোগানড্রয়েড

হ্যাঁ @ বাউকেটা, একটি বিকল্প। তবে, একটি সিনট্যাক্সে বা অন্যটিতে মেমরির ব্যবহারে কোন পার্থক্য দেখা দিতে পারে?
caarlos0

2
কীভাবে এটি একটি গঠনমূলক মন্তব্য?
Louth স্বাগতম

2
জাভা নির্মাতারা একটি নতুন কীওয়ার্ড: notinstanceof প্রবর্তন করতে পারেন । মাত্র আমার দুটি সেন্ট ^^
স্টিফান

উত্তর:


308

না, এর চেয়ে ভাল উপায় আর নেই; আপনার ব্যাক্তিগত।


132

আমি জানি না আপনি "সুন্দরী" বলার সময় আপনি কী কল্পনা করেছিলেন তবে এ সম্পর্কে কী? আমি ব্যক্তিগতভাবে মনে করি এটি আপনার পোস্ট করা ক্লাসিক ফর্মের চেয়ে খারাপ, তবে কেউ এটি পছন্দ করতে পারে ...

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

2
দ্বৈত যুক্তি সম্পর্কে, আপনি এর != trueপরিবর্তে ব্যবহার করতে পারেন == false: ডি
জুপী

এটি দেখানো আমাকে বুঝতে সাহায্য করে যে if(!(str instanceof String)) এটিই একমাত্র সঠিক উপায়, এবং আমার বিকল্পগুলি চিন্তা করা বন্ধ করতে হবে
বিকাশ

আমি এই সমাধানটি পছন্দ করি কারণ এটি পড়ার সময় আমার কোনও ধাতব স্ট্যাক তৈরির প্রয়োজন হয় না!
জেএম

59

আপনি Class.isInstanceপদ্ধতিটি ব্যবহার করতে পারেন :

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

... তবে এটি এখনও অবহেলিত এবং বেশ কুৎসিত।


5
কিছুটা ভাল, অতিরিক্ত বন্ধনী কোডটিকে কুৎসিত করে তোলে, আইএমএইচও।
caarlos0

এটি কি খুব ধীর হয় না?
ম্যাক্সমানম্যান

4
এর আলাদা আচরণ রয়েছে। উদাহরণস্বরূপ কীওয়ার্ডটিতে সাবক্লাস রয়েছে, পদ্ধতিটি নয়, আচরণটির প্রতিলিপি তৈরি করতে আপনার Class.isAignignFrom ব্যবহার করা দরকার to
ক্রিস কুপার

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)) { ...। ভাল না, imo, কিন্তু কাজ করা উচিত!
প্যাট্রিক এম

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

আমি অনুমান করি যে এটি টাইপস্ক্রিপ্টে উপযুক্ত এবং নিয়মিত জেএস না হওয়ার উপযুক্ত কারণ হ'ল টাইপগার্ডগুলি একটি সাধারণ কনভেনশন, সুতরাং আপনি যদি এগুলি অন্য ইন্টারফেসের জন্য লেখেন তবে ক্লাসে তাদের লেখার পক্ষে যুক্তিযুক্ত / বোধগম্য / স্বাভাবিক।

ডক্সে এই জাতীয় ব্যবহারকারীর সংজ্ঞায়িত ধরণের রক্ষীদের সম্পর্কে আরও বিশদ রয়েছে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.