জাভাতে 'ইনস্ট্যান্সফ' অপারেটরটি কী ব্যবহৃত হয়?


163

instanceofঅপারেটর কিসের জন্য ব্যবহৃত হয়? আমি মত জিনিস দেখেছি

if (source instanceof Button) {
    //...
} else {
    //...
}

তবে এর কিছুই আমার কাছে বোধগম্য হয়নি। আমি আমার গবেষণাটি করেছি, তবে কেবল কোনও ব্যাখ্যা ছাড়াই উদাহরণ দিয়ে এসেছি।


38
এখানে প্রশ্ন জিজ্ঞাসা করার ক্ষেত্রে কোনও ভুল নেই, তবে আপনি যদি জাভা শিখেন তবে আপনি একটি বই পেতে চাইতে পারেন। যে কোনও শালীন জাভা বইয়ের এই প্রশ্নের উত্তর থাকবে এবং পরবর্তী 1000 আপনি যাবেন।
রাষ্ট্রপতি জেমস কে পোলক

যেমন একটি অপারেটর অনেক নির্দিষ্ট ব্যবহার আছে। এটি যদি আপনার কাছে বোধগম্য নয় এমন উদাহরণগুলির একটি ব্যাখ্যা জিজ্ঞাসা করে তবে এটি একটি নির্দিষ্ট প্রশ্ন হবে question
রায়েডওয়াল্ড

2
নীচের উত্তরগুলি সঠিক, তবে নোট করুন যে উদাহরণস্বরূপ 10 এর মধ্যে 9 বার একটি অতিরিক্ত ব্যবহৃত অপারেটর এটি পলিমারফিজমের সঠিক ব্যবহার দ্বারা প্রতিস্থাপিত হতে পারে (সবসময় নয়, প্রায়শই)
রিচার্ড টিংল

আমি রিচার্ডের চেয়ে আরও কিছুটা এগিয়ে যেতে পারি: আমি উদাহরণের বৈধ ব্যবহার কখনও দেখিনি। এটি কেবলমাত্র খারাপ ডিজাইনের কোডের উপরে দ্রুত হ্যাকগুলির জন্য কার্যকর useful আপনি যদি ওওপি পছন্দ না করেন তবে অন্য ভাষায় লিখুন (প্রচুর পরিমাণে রয়েছে)। উদাহরণস্বরূপ কেবল "না" বলুন!
স্কট বিগস

5
@ স্কটবিগস instanceofওভাররাইড করার সময় কি কোনও ভাল বিকল্প আছে equals?
বেন অ্যারনসন

উত্তর:


228

instanceofকীওয়ার্ড একটি বাইনারি অপারেটর যা কোনও বস্তুর পরীক্ষার জন্য ব্যবহৃত হয় (উদাহরণ) প্রদত্ত প্রকারের একটি উপ-টাইপ হয়।

কল্পনা করুন:

interface Domestic {}
class Animal {}
class Dog extends Animal implements Domestic {}
class Cat extends Animal implements Domestic {}

এরপরে তৈরি একটি dog বস্তুর কল্পনা করুন Object dog = new Dog(), তারপরে:

dog instanceof Domestic // true - Dog implements Domestic
dog instanceof Animal   // true - Dog extends Animal
dog instanceof Dog      // true - Dog is Dog
dog instanceof Object   // true - Object is the parent type of all objects

তবে, সাথে Object animal = new Animal();,

animal instanceof Dog // false

কারণ Animalএকটি সুপারটাইপDog এবং সম্ভবত কম "সংশোধিত"।

এবং,

dog instanceof Cat // does not even compile!

এটি কারণ Dogকোনও উপপ্রকার বা সুপার টাইপ নয়Cat এবং এটি এটি প্রয়োগ করে না।

নোট করুন যে dogউপরের জন্য ব্যবহৃত ভেরিয়েবল প্রকারের Object। এটি instanceofএকটি রানটাইম অপারেশন এবং এটি আমাদের / ব্যবহারের ক্ষেত্রে নিয়ে আসে: রানটাইমের সময় কোনও অবজেক্টের উপর ভিত্তি করে ভিন্নভাবে প্রতিক্রিয়া দেখাতে

লক্ষণীয় বিষয়: expressionThatIsNull instanceof Tসমস্ত প্রকারের জন্য মিথ্যাT

শুভ কোডিং।


14
আমি শুধু চেষ্টা করেছি - Object dog = new Dog(); System.out.println(dog instanceof Cat);। এটি ঠিক জরিমানা করে প্রিন্ট করে falsedog
সংকলকটি

আপনি এটি চেষ্টা করার সময় আপনি একটি ভুল করেছেন যে কারও জন্য ভাবছেন: জেএলএস বিভাগ 15.20.2 হল আপনি যা সন্ধান করছেন। ন্যূনতম অপ্রচলিত উদাহরণের জন্য:boolean b = "foo" instanceof Integer;
ফেলিক্স এস

3
@ ফেলিক্স আপনার আবার উত্তরটি পড়তে হবে। উত্তর সম্পর্কে Object indirect = ...; if (indirect instanceof Something)if (literal instanceof Something)আপনি যেমন ধরে নিয়েছেন বলে মনে হচ্ছে এটি এমন নয় ।
এরউইন বলউইড্ট

1
@ ইরভিনবোলভিড ওহ, ঠিক আছে, আমি অবশ্যই এই Object dogঅংশটি এড়িয়ে গেছি । আমার খারাপ!
ফেলিক্স এস

dog instanceof Cat // does not even compile!(কারণ এটি একটি শ্রেণি)। যদি Catকোনও ইন্টারফেস হয় তবে এটি সংকলন করবে।
হামজা বেল্মেলৌকি

44

এটি এমন একটি অপারেটর যা সত্যের ফেরত দেয় যদি অভিব্যক্তির বাম দিকের উদাহরণ থাকে ডানদিকে শ্রেণীর নামের

এই ভাবে চিন্তা করুন। বলুন যে আপনার ব্লকের সমস্ত বাড়ি একই ব্লুপ্রিন্টগুলি থেকে নির্মিত হয়েছিল। দশটি ঘর (অবজেক্টস), ব্লুপ্রিন্টগুলির একটি সেট (শ্রেণি সংজ্ঞা)।

instanceofযখন আপনি বস্তুর সংগ্রহ পেয়েছেন এবং সেগুলি কী তা আপনি নিশ্চিত নন। ধরা যাক যে আপনি একটি ফর্মের উপর নিয়ন্ত্রণের সংগ্রহ পেয়েছেন। চেকবক্সগুলি যেখানেই রয়েছে তার পরীক্ষিত অবস্থাটি আপনি পড়তে চান, তবে আপনি এটির পরীক্ষিত অবস্থার জন্য কোনও সরল পুরানো অবজেক্টটি জিজ্ঞাসা করতে পারবেন না। পরিবর্তে, আপনি দেখতে পাবেন যে প্রতিটি বস্তু একটি চেকবাক্স, এবং যদি তা হয় তবে এটি একটি চেকবক্সে কাস্ট করুন এবং এর বৈশিষ্ট্যগুলি পরীক্ষা করুন।

if (obj instanceof Checkbox)
{
    Checkbox cb = (Checkbox)obj;
    boolean state = cb.getState();
}

15
এর অর্থ হল, instanceofব্যবহারটি এটি ডাউনকাস্টে নিরাপদ করতে পারে।
রাইডওয়াল্ড

29

এই সাইটে বর্ণিত হিসাবে :

instanceofঅপারেটর পরীক্ষা করতে ব্যবহার করা যেতে পারে, যদি একটি বস্তু একটি নির্দিষ্ট ধরনের হয় ...

if (objectReference instanceof type)

একটি দ্রুত উদাহরণ:

String s = "Hello World!"
return s instanceof String;
//result --> true

তবে instanceofনাল রেফারেন্স ভেরিয়েবল / এক্সপ্রেশনটিতে আবেদন করা মিথ্যা বলে প্রত্যাবর্তন করে।

String s = null;
return s instanceof String;
//result --> false

যেহেতু একটি সাবক্লাস তার সুপারক্লাসের একটি 'টাইপ', তাই আপনি এটি instanceofযাচাই করতে ব্যবহার করতে পারেন ...

class Parent {
    public Parent() {}
}

class Child extends Parent {
    public Child() {
        super();
    }
}

public class Main {
    public static void main(String[] args) {
        Child child = new Child();
        System.out.println( child instanceof Parent );
    }
}
//result --> true

আশা করি এটা কাজে লাগবে!


15

এই অপারেটর আপনাকে কোনও সামগ্রীর ধরণ নির্ধারণ করতে দেয় allows এটি aboolean মান প্রদান করে।

উদাহরণ স্বরূপ

package test;

import java.util.Date;
import java.util.Map;
import java.util.HashMap;

public class instanceoftest
{
    public static void main(String args[])
    {
        Map m=new HashMap();
        System.out.println("Returns a boolean value "+(m instanceof Map));
        System.out.println("Returns a boolean value "+(m instanceof HashMap));
        System.out.println("Returns a boolean value "+(m instanceof Object));
        System.out.println("Returns a boolean value "+(m instanceof Date));
    }
} 

আউটপুটটি হ'ল:

Returns a boolean value true
Returns a boolean value true
Returns a boolean value true
Returns a boolean value false


4

অন্যান্য উত্তরে যেমন উল্লেখ করা হয়েছে, instanceofতাত্পর্যপূর্ণ সাধারণ ব্যবহারটি যদি কোনও সনাক্তকারী আরও নির্দিষ্ট ধরণের উল্লেখ করে কিনা তা যাচাই করার জন্য। উদাহরণ:

Object someobject = ... some code which gets something that might be a button ...
if (someobject instanceof Button) {
    // then if someobject is in fact a button this block gets executed
} else {
    // otherwise execute this block
}

তবে খেয়াল করুন, বাম-হাতের এক্সপ্রেশনটির ধরণটি অবশ্যই ডান হাতের অভিব্যক্তির পিতামাতার ধরণের হতে হবে ( JLS 15.20.2 এবং জাভা পাজলারস, # 50, পিপি 114 দেখুন )। উদাহরণস্বরূপ, নিম্নলিখিতগুলি সংকলন করতে ব্যর্থ হবে:

public class Test {
    public static void main(String [] args) {
        System.out.println(new Test() instanceof String); // will fail to compile
    }
}

এই বার্তাটি সংকলন করতে ব্যর্থ:

Test.java:6: error: inconvertible types
        System.out.println(t instanceof String);
                       ^
  required: String
  found:    Test
1 error

যেমন Testএকটি পিতামাতা ক্লাস না String। OTOH, এটি নিখুঁতভাবে সংকলন করে এবং falseপ্রত্যাশার মতো প্রিন্ট করে :

public class Test {
    public static void main(String [] args) {
        Object t = new Test();
        // compiles fine since Object is a parent class to String
        System.out.println(t instanceof String); 
    }
}

অনুমানটি লিঙ্ক করার জন্য ধন্যবাদ!
jpaugh 19

1
public class Animal{ float age; }

public class Lion extends Animal { int claws;}

public class Jungle {
    public static void main(String args[]) {

        Animal animal = new Animal(); 
        Animal animal2 = new Lion(); 
        Lion lion = new Lion(); 
        Animal animal3 = new Animal(); 
        Lion lion2 = new Animal();   //won't compile (can't reference super class object with sub class reference variable) 

        if(animal instanceof Lion)  //false

        if(animal2 instanceof Lion)  //true

        if(lion insanceof Lion) //true

        if(animal3 instanceof Animal) //true 

    }
}

1

সমতা পরীক্ষায় শর্টহ্যান্ড হিসাবে ব্যবহার করা যেতে পারে।

সুতরাং এই কোড

if(ob != null && this.getClass() == ob.getClass) {
}

হিসাবে লেখা যেতে পারে

if(ob instanceOf ClassA) {
}

1

বেশিরভাগ মানুষ এই প্রশ্নের "কী" সঠিকভাবে ব্যাখ্যা করেছেন তবে কেউ "কীভাবে" সঠিকভাবে ব্যাখ্যা করেন নি।

সুতরাং এখানে একটি সাধারণ চিত্র:

String s = new String("Hello");
if (s instanceof String) System.out.println("s is instance of String"); // True
if (s instanceof Object) System.out.println("s is instance of Object"); // True
//if (s instanceof StringBuffer) System.out.println("s is instance of StringBuffer"); // Compile error
Object o = (Object)s;
if (o instanceof StringBuffer) System.out.println("o is instance of StringBuffer"); //No error, returns False
else System.out.println("Not an instance of StringBuffer"); // 
if (o instanceof String) System.out.println("o is instance of String"); //True

আউটপুট:

s is instance of String
s is instance of Object
Not an instance of StringBuffer
o is instance of String

কম্পাইলার এরর জন্য কারণ যখন তুলনা sStringBuffer সঙ্গে ভাল ব্যাখ্যা করা হয় ডক্স :

আপনি এটি পরীক্ষার জন্য ব্যবহার করতে পারেন যদি কোনও অবজেক্ট কোনও শ্রেণীর উদাহরণ, সাবক্লাসের উদাহরণ, বা কোনও শ্রেণীর উদাহরণ যা কোনও নির্দিষ্ট ইন্টারফেস প্রয়োগ করে।

যা এলএইচএসকে বোঝায় যে হয় হয় আরএইচএসের কোনও উদাহরণ হতে হবে বা কোনও শ্রেণীর যেটি আরএইচএস প্রয়োগ করে বা আরএইচএস প্রসারিত করে।

এরপরে কীভাবে ব্যবহার করবেন?
যেহেতু প্রতিটি শ্রেণি অবজেক্টকে প্রসারিত করে, তাই আপত্তি করার জন্য টাইপ-কাস্টিং এলএইচএস সর্বদা আপনার পক্ষে কাজ করবে:

String s = new String("Hello");
if ((Object)s instanceof StringBuffer) System.out.println("Instance of StringBuffer"); //No compiler error now :)
else System.out.println("Not an instance of StringBuffer");

আউটপুট:

Not an instance of StringBuffer

শেষ উদাহরণে, কেন এটি "স্ট্রিংবুফারের উদাহরণ নয়"? যেহেতু আপনি এলএইচএসে অবজেক্টে এস টাইপ করেছেন এবং এটি আরএইচএসের কোনও উদাহরণ কিনা তা যাচাই করছেন if ((Object)s instanceof StringBuffer) System.out.println("Instance of StringBuffer"); //shouldn't this be true, যেহেতু আমরা Obজেক্টে টাইপ করছি?
sofs1

কারণ এস স্ট্রিং অবজেক্টের একটি রেফারেন্স (জাভা সি ++ এর বিপরীতে ডায়নামিক পলিমারফিজম নিযুক্ত করে) এবং স্ট্রিং স্ট্রিংবুফারের একটি সাবক্লাস নয়।
sirairaqui

0

উদাহরণস্বরূপ অপারেটর একটি বস্তুর সাথে একটি নির্দিষ্ট ধরণের তুলনা করে। আপনি এটি পরীক্ষার জন্য ব্যবহার করতে পারেন যদি কোনও অবজেক্ট কোনও শ্রেণীর উদাহরণ, সাবক্লাসের উদাহরণ, বা কোনও শ্রেণীর উদাহরণ যা কোনও নির্দিষ্ট ইন্টারফেস প্রয়োগ করে।

http://download.oracle.com/javase/tutorial/java/nutsandbolts/op2.html


0

কীওয়ার্ডের ইনস্ট্যান্স সহায়ক যখন আপনি নির্দিষ্ট কোনও অবজেক্টের উদাহরণ জানতে চান।

ধরুন আপনি ব্যতিক্রম ছোঁড়াচ্ছেন এবং যখন আপনি ধরা পড়বেন তখন যোগফল কাস্টম পরিচালনা করুন এবং তারপরে আবার আপনার যুক্তি অনুসারে চালিয়ে যান (নিক্ষেপ বা লগ ইত্যাদি)

উদাহরণ: 1) ব্যবহারকারী তৈরি কাস্টম ব্যতিক্রম "অবৈধ এক্সটেনশান এক্সেক্সশন" এবং যুক্তি অনুসারে এটিকে ফেলে দিন

2) এখন ক্যাচ ব্লক ক্যাচে (ব্যাতিকরণ ই) exception ব্যতিক্রম প্রকারটি "অবৈধ এক্সটেনশন এক্সেক্সশন" হলে যোগ যুক্তি সম্পাদন করুন

InvalidExtensionsException InvalidException =(InvalidExtensionsException)e;

3) আপনি যদি উদাহরণটি পরীক্ষা করছেন না এবং ব্যতিক্রমের ধরনটি নাল পয়েন্টার ব্যতিক্রম আপনার কোডটি ভেঙে যাবে।

সুতরাং আপনার যুক্তিটি যদি এর (উদাহরণস্বরূপ অবৈধ এক্সটেনশান এক্সেক্সশন) এর অভ্যন্তরে থাকা উচিত {অবৈধ এক্সটেনশন এক্সপশন অকার্যকর এক্সপ্রেশন = (অবৈধ এক্সটেনশন এক্সেক্সশন) ই; }

উপরে উদাহরণস্বরূপ ভুল কোডিং অনুশীলন তবে এই উদাহরণটি এর উদাহরণটি বুঝতে আপনাকে সহায়তা করে।


0

সেরা ব্যাখ্যা jls হয় । সোর্স কী বলে তা যাচাই করার চেষ্টা করুন। সেখানে আপনি সেরা উত্তরটি আরও অনেক কিছু পাবেন। এখানে কিছু অংশ পুনরুত্পাদন করা হচ্ছে:

উদাহরণস্বরূপ অপারেটরের রিলেশনাল এক্সপ্রেশন অপারেন্ডের ধরণটি অবশ্যই একটি রেফারেন্স টাইপ বা নাল টাইপ হতে হবে; অন্যথায়, একটি সংকলন-সময় ত্রুটি ঘটে।

উদাহরণস্বরূপ অপারেটরের পরে উল্লিখিত রেফারেন্স টাইপটি সংশোধনযোগ্য (§4.7) উল্লেখযোগ্য রেফারেন্স টাইপকে নির্দেশ না করে তবে এটি একটি সংকলন-সময় ত্রুটি।

যদি রেফারেন্স টাইপের সাথে সম্পর্কিত সম্পর্কিত এক্সপ্রেসের কোনও castালাই (§15.16) একটি সংকলন-সময় ত্রুটি হিসাবে প্রত্যাখ্যান করা হয়, তবে উদাহরণস্বরূপ রিলেশনাল এক্সপ্রেশন একইভাবে একটি সংকলন-সময় ত্রুটি তৈরি করে। এমন পরিস্থিতিতে, উদাহরণস্বরূপ প্রকাশের ফলাফলটি কখনই সত্য হতে পারে না।


0

জাভা instanceofঅপারেটরটি বস্তুটি নির্দিষ্ট ধরণের (শ্রেণি বা সাবক্লাস বা ইন্টারফেস) উদাহরণ হিসাবে পরীক্ষা করার জন্য ব্যবহৃত হয়।

জাভাতে উদাহরণস্বরূপ টাইপ comparison operatorহিসাবে পরিচিত কারণ এটি উদাহরণের সাথে টাইপের সাথে তুলনা করে। এটি হয় trueবা হয় false। আমরা যদি instanceofকোনও ভেরিয়েবলের nullমান সহ অপারেটরটি প্রয়োগ করি তবে এটি ফিরে আসেfalse

JDK থেকে 14+ যাতে JEP 305 অন্তর্ভুক্ত আমরা এর জন্য "প্যাটার্ন ম্যাচিং "ও করতে পারিinstanceof

প্যাটার্নগুলি মূলত এটি পরীক্ষা করে যে কোনও মান একটি নির্দিষ্ট ধরণের থাকে এবং মানটির সাথে ম্যাচিং টাইপ থাকলে তথ্যটি বের করতে পারে। প্যাটার্ন মিলটি কোনও সিস্টেমে সাধারণ যুক্তির আরও স্পষ্ট এবং দক্ষ অভিব্যক্তির অনুমতি দেয়, যথা বস্তু থেকে উপাদানগুলির শর্তসাপেক্ষে অপসারণ।

জাভা 14 এর আগে

if (obj instanceof String) {
    String str = (String) obj; // need to declare and cast again the object
    .. str.contains(..) ..
}else{
     str = ....
}

জাভা 14 বৃদ্ধি

if (!(obj instanceof String str)) {
    .. str.contains(..) .. // no need to declare str object again with casting
} else {
    .. str....
}

আমরা প্রকার চেক এবং অন্যান্য শর্তগুলি একত্রিত করতে পারি

if (obj instanceof String str && str.length() > 4) {.. str.contains(..) ..}

প্যাটার্ন মিলের ব্যবহার instanceofজাভা প্রোগ্রামগুলিতে সুস্পষ্ট কাস্টের সামগ্রিক সংখ্যা হ্রাস করা উচিত।

PS : instanceOfকেবল তখনই মিলবে যখন বস্তুটি শূন্য নয়, কেবল তখনই এটি নির্ধারিত হতে পারে str


-1
class Test48{
public static void main (String args[]){
Object Obj=new Hello();
//Hello obj=new Hello;
System.out.println(Obj instanceof String);
System.out.println(Obj instanceof Hello);
System.out.println(Obj instanceof Object);
Hello h=null;
System.out.println(h instanceof Hello);
System.out.println(h instanceof Object);
}
}  

1
কেবলমাত্র স্ট্যাক-ওভারফ্লোতে কোডের উত্তর পোস্ট করবেন না। দয়া করে এগিয়ে যান এবং একটি ব্যাখ্যা যুক্ত করুন।
এল। গুথার্ট

-2

খুব সাধারণ কোড উদাহরণ:

If (object1 instanceof Class1) {
   // do something
} else if (object1 instanceof Class2) {
   // do something different
}

এখানে সাবধান। উপরের উদাহরণে, ক্লাস 1 যদি অবজেক্ট হয় তবে প্রথম তুলনাটি সর্বদা সত্য হবে। সুতরাং, কেবল ব্যতিক্রমগুলির মতো, শ্রেণিবিন্যাসের আদেশের বিষয়টি!


-2

উদাহরণস্বরূপ আপনি উচ্চতর বিমূর্ততা তৈরি করতে মানচিত্রটি ব্যবহার করতে পারেন

private final Map<Class, Consumer<String>> actions = new HashMap<>();

তারপরে এ জাতীয় মানচিত্রটি এতে কিছু পদক্ষেপ যুক্ত করে:

actions.put(String.class, new Consumer<String>() {
        @Override
        public void accept(String s) {
           System.out.println("action for String");       
        }
    };

তারপরে অচেনা ধরণের অবজেক্ট থাকার কারণে আপনি সেই মানচিত্রটি থেকে নির্দিষ্ট ক্রিয়াটি পেতে পারেন:

actions.get(someObject).accept(someObject)

-2

উদাহরণস্বরূপ অপারেটরটি বস্তুটি নির্দিষ্ট ধরণের কোনও উদাহরণ কিনা তা পরীক্ষা করতে ব্যবহৃত হয়। (ক্লাস বা সাবক্লাস বা ইন্টারফেস)।

উদাহরণটি টাইপ তুলনা অপারেটর হিসাবেও পরিচিত কারণ এটি উদাহরণের সাথে টাইপের সাথে তুলনা করে। এটি সত্য বা মিথ্যা প্রত্যাবর্তন করে।

class Simple1 {  
public static void main(String args[]) {  
Simple1 s=new Simple1();  
System.out.println(s instanceof Simple1); //true  
}  
}  

যদি আমরা কোনও নূন্যমূল্যযুক্ত কোনও ভেরিয়েবলের সাথে উদাহরণস্বরূপ অপারেটরটি প্রয়োগ করি তবে এটি মিথ্যা প্রত্যাবর্তন করে।

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