উদাহরণস্বরূপ Vs getClass ()


114

আমি কর্মক্ষমতা লাভ যখন ব্যবহার দেখতে getClass()এবং ==উপর অপারেটর instanceOfঅপারেটর।

Object  str = new Integer("2000");

long starttime = System.nanoTime();

if(str instanceof String) {
    System.out.println("its string");
} else {
    if (str instanceof Integer) {
        System.out.println("its integer");

    }
}

System.out.println((System.nanoTime()-starttime));

starttime = System.nanoTime();

if(str.getClass() == String.class) {
    System.out.println("its string in equals");
} else {
    if(str.getClass() == Integer.class) {
        System.out.println("its integer");
    }
}

System.out.println((System.nanoTime()-starttime));

কোন গাইডলাইন আছে, কোনটি ব্যবহার করবেন getClass()বা instanceOf?

পরিস্থিতি দেওয়া: আমি মিলেছে করা সঠিক শ্রেণীর জানি, যে String, Integer(এই চূড়ান্ত ক্লাস আছে), ইত্যাদি

instanceOfঅপারেটর ব্যবহার খারাপ অভ্যাস ব্যবহার করছেন ?


3
এটিতে ব্যাখ্যা করা হয়েছে: stackoverflow.com/questions/596462/…
ক্লিমেন্ট পি

2
আপনার সময় পদ্ধতিটি কৃত্রিম বিলম্বের কারণ এবং ভুল সময়সীমার ফলাফল তৈরি করছে। আপনি চেকগুলি করার আদেশটি অদলবদল করুন এবং আপনি যে প্রথম চেকটি করছেন তা দেখতে পাবেন (হয় == বা উদাহরণস্বরূপ) সর্বদা দীর্ঘ হবে। আমি অনুমান করব এটি প্রিন্টলাইন (গুলি)। আপনার কখনই সেই জিনিসটি আপনার সময়সীমার মধ্যে অন্তর্ভুক্ত করা উচিত নয়।
কুর্তজমার্ক

পারফরম্যান্সের তুলনা করতে নির্ভুলতার জন্য কেবল একটি মন্তব্য, একাধিক চক্র পুনরাবৃত্তি (যেমন 10000) ব্যবহার করুন নির্ভুলতার উন্নতি করতে। একটি একক অনুরোধ একটি ভাল পরিমাপ নয়।
martins.tuga

উত্তর:


139

এর পারফরম্যান্স instanceofএবং getClass() == ...আলাদা হওয়ার কারণটি হ'ল তারা বিভিন্ন জিনিস করছে।

  • instanceofবাম-হাতের (এলএইচএস) অবজেক্টের রেফারেন্সটি ডান-হাতের দিকের (আরএইচএস) বা কিছু উপ -টাইপের উদাহরণ কিনা তা পরীক্ষা করে ।

  • getClass() == ... ধরণগুলি অভিন্ন কিনা তা পরীক্ষা করে।

সুতরাং প্রস্তাবনাটি হ'ল পারফরম্যান্স ইস্যুটি উপেক্ষা করা এবং বিকল্পটি ব্যবহার করা যা আপনাকে প্রয়োজনীয় উত্তরটি দেয়।

instanceOfঅপারেটর ব্যবহার খারাপ অভ্যাস?

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

তবে এমন কিছু ঘটনা রয়েছে যেখানে এগুলি "ডিজাইনের গন্ধ" নয়। উদাহরণস্বরূপ, equals(Object)আপনাকে আর্গুমেন্টের প্রকৃত ধরণের পরীক্ষা করতে হবে এবং falseএটি মেলে না তবে ফিরে আসুন। এটি সবচেয়ে ভাল ব্যবহার করে করা হয় getClass()


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


@ স্টেফেনসি যেমন আপনি বলেছিলেন, এটি হয় code smellব্যবহার করা। তার অর্থ, এটি খারাপ ডিজাইনের (নন-পলিমারফিক) কোডের ফলাফল যা আপনাকে কোনওভাবেই ব্যবহার করতে দেয়। আমি কি তাদের উভয়ের ব্যবহার এইভাবে অনুমান করতে পারি?
30:25

@ সার্বভৌম পরিবর্তন - 1) আমি বলেছি "অতিরিক্ত ব্যবহার" "ব্যবহার" নয়। ২) এগুলি বাদে আপনি কী জিজ্ঞাসা করছেন তা আমি বুঝতে পারি না। "অনুমানের ব্যবহারটি ..." বলতে আপনার কী বোঝায় ??? কোড হয় এই জিনিসগুলি ব্যবহার করে, বা এটি ব্যবহার করে না।
স্টিফেন সি

কোডটি বিদ্যমান খারাপ ডিজাইনের (নন-পলিমারফিক) কারণে instanceofএবং এর ব্যবহার getClass()ছবিতে আসে I আমি কি সঠিক?

5
@ সার্বভৌম বিনিময় - আপনি বৈধতার সাথে অনুমান করতে পারবেন না যে সমস্ত ব্যবহার instanceof(উদাহরণস্বরূপ) খারাপ নকশা। এমন পরিস্থিতি রয়েছে যেখানে এটি সেরা সমাধান হতে পারে। একই জন্য getClass()। আমি পুনরাবৃত্তি করব যে আমি "অত্যধিক ব্যবহার" বলেছি এবং "ব্যবহার" করছি না । প্রতিটি মামলার বিচার তার বিচার করা উচিত ... অন্ধভাবে কিছু দুর্বল প্রতিষ্ঠিত গোপনীয় নিয়ম প্রয়োগ করে নয়।
স্টিফেন সি

43

আপনি কি কোনও ক্লাসের সাথে ঠিক মিল করতে চান , যেমন FileInputStreamকোনও সাবক্লাসের পরিবর্তে কেবল মিলছেন FileInputStream? যদি তাই হয়, getClass()এবং ব্যবহার করুন ==। আমি সাধারণত এটি একটিতে করতাম equals, যাতে এক্স এর উদাহরণটি X এর উপক্লাসের উদাহরণের সমান হিসাবে বিবেচিত না হয় - অন্যথায় আপনি জটিল প্রতিসাম্বি সমস্যার মধ্যে পড়তে পারেন। অন্যদিকে, এটি তুলনা করার জন্য সাধারণত দরকারী যে দুটি বস্তু একটি নির্দিষ্ট শ্রেণির চেয়ে একই শ্রেণির হয়।

অন্যথায়, ব্যবহার করুন instanceof। মনে রাখবেন যে আপনার সাথে এটি শুরু getClass()করতে একটি নন-রেফারেন্স রেফারেন্স রয়েছে তা নিশ্চিত করতে হবে বা আপনি একটি পেয়ে যাবেন NullPointerException, তবে প্রথম অপারেন্ডটি বাতিল হলে instanceofকেবল ফিরে আসবে false

ব্যক্তিগতভাবে আমি বলতে চাই instanceofকিন্তু ব্যবহার - আরো কথ্য হয় পারেন তাদের ব্যাপকভাবে বেশিরভাগ ক্ষেত্রেই একটি নকশা গন্ধ হয়।


18

আমি জানি এটি জিজ্ঞাসা করার পরে অনেক সময় হয়েছে, তবে আমি গতকাল একটি বিকল্প শিখেছি

আমরা সবাই জানি আপনি এটি করতে পারেন:

if(o instanceof String) {   // etc

তবে আপনি কী ধরণের শ্রেণি হতে হবে তা ঠিক যদি না জানেন তবে কী হবে? আপনি সাধারণভাবে করতে পারবেন না:

if(o instanceof <Class variable>.getClass()) {   

এটি একটি সংকলন ত্রুটি দেয়।
পরিবর্তে, এখানে একটি বিকল্প - isignableFrom ()

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

public static boolean isASubClass(Class classTypeWeWant, Object objectWeHave) {

    return classTypeWeWant.isAssignableFrom(objectWeHave.getClass())
}

8
ব্যবহার করবেন না isAssignableFromo instanceof Stringপ্রতিবিম্ব ব্যবহার করে লেখার সঠিক উপায় হ'ল String.getClass().isInstance(o)। জাভাডোক এমনকি বলেছেন: এই পদ্ধতিটি জাভা ভাষার instanceofঅপারেটরের গতিশীল সমতুল্য ।
আন্দ্রেয়াস

3

getClass () -এর সীমাবদ্ধতা রয়েছে যে অবজেক্টগুলি কেবল একই শ্রেণীর অন্যান্য বস্তুর সমান, একই রান টাইম টাইপ, নীচের কোডের আউটপুটে চিত্রিত:

class ParentClass{
}
public class SubClass extends ParentClass{
    public static void main(String []args){
        ParentClass parentClassInstance = new ParentClass();
        SubClass subClassInstance = new SubClass();
        if(subClassInstance instanceof ParentClass){
            System.out.println("SubClass extends ParentClass. subClassInstance is instanceof ParentClass");
        }
        if(subClassInstance.getClass() != parentClassInstance.getClass()){
            System.out.println("Different getClass() return results with subClassInstance and parentClassInstance ");
        }
    }
}

আউটপুট:

সাবক্লাস প্যারেন্টক্লাস প্রসারিত করে। সাবক্লাসআইনস্ট্যান্স উদাহরণস্বরূপ প্যারেন্টক্লাস।

সাব-ক্লাসআইনস্ট্যান্স এবং প্যারেন্টক্লাসআইনস্ট্যান্সের সাথে বিভিন্ন গেটক্লাস () রিটার্নের ফলাফল।

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