ব্যবহারের মধ্যে কোনও পছন্দ বা আচরণের পার্থক্য রয়েছে:
if(obj.getClass().isArray()) {}
এবং
if(obj instanceof Object[]) {}
?
ব্যবহারের মধ্যে কোনও পছন্দ বা আচরণের পার্থক্য রয়েছে:
if(obj.getClass().isArray()) {}
এবং
if(obj instanceof Object[]) {}
?
উত্তর:
বেশিরভাগ ক্ষেত্রে, আপনার ব্যবহার করা উচিত instanceof
কোনও বস্তু অ্যারে কিনা তা পরীক্ষা করার অপারেটরটি ।
সাধারণত, আপনি কোনও নির্দিষ্ট ধরণের ডাউন কাস্টিংয়ের আগে কোনও বস্তুর প্রকার পরীক্ষা করেন যা সংকলনের সময় জানা যায়। উদাহরণস্বরূপ, সম্ভবত আপনি কিছু কোড লিখেছেন যা একটি Integer[]
বা একটি এর সাথে কাজ করতে পারে int[]
। আপনি আপনার কাস্টগুলি এর সাথে রক্ষা করতে চান instanceof
:
if (obj instanceof Integer[]) {
Integer[] array = (Integer[]) obj;
/* Use the boxed array */
} else if (obj instanceof int[]) {
int[] array = (int[]) obj;
/* Use the primitive array */
} else ...
জেভিএম স্তরে instanceof
অপারেটর একটি নির্দিষ্ট "উদাহরণস্বরূপ" তে অনুবাদ করে বাইট কোডে যা বেশিরভাগ জেভিএম বাস্তবায়নে অনুকূলিত।
বিরল ক্ষেত্রে, আপনি অজানা প্রকারের কোনও অবজেক্টের গ্রাফটি অতিক্রম করার জন্য প্রতিচ্ছবি ব্যবহার করছেন। এই জাতীয় ক্ষেত্রে, isArray()
পদ্ধতিটি সহায়ক হতে পারে কারণ আপনি সংকলনের সময় উপাদানটির ধরন জানেন না; আপনি উদাহরণস্বরূপ, কিছু ধরণের সিরিয়ালাইজেশন প্রক্রিয়াটি প্রয়োগ করছেন এবং অ্যারের প্রতিটি উপাদানকে একই সিরিয়ালাইজেশন পদ্ধতিতে নির্ধারণ করতে সক্ষম হবেন, নির্বিশেষে।
দুটি বিশেষ ক্ষেত্রে রয়েছে: নাল রেফারেন্স এবং আদিম অ্যারেগুলির রেফারেন্স।
একটি নাল রেফারেন্স কারণ হবে instanceof
ফলাফলেরfalse
, যখন isArray
নিক্ষেপ a NullPointerException
।
একটি আদিম অ্যারে প্রয়োগ করা হয়, ডান হাতের অপারেণ্ডে উপাদান ধরণের উপাদানটির সাথে সঠিকভাবে মেলে না হলে instanceof
ফলন false
পাওয়া যায়। বিপরীতে, isArray()
যে true
কোনও উপাদান ধরণের জন্য ফিরে আসবে ।
obj instanceof int[]
উৎপাদনের false
যখন আপনি একটি দায়িত্ব অর্পণ int[]
করতে obj
, আপনি ভুল করছেন।
obj instanceof Object[]
ফলন । false
Object obj = new int[7]
java.lang.Object
, যাতে এটি বোঝা যায়। তবে instanceof
এখনও আদিম অ্যারে পরীক্ষার জন্য ব্যবহার করা যেতে পারে।
isArray()
ব্যবহার করা উচিত। কেবলমাত্র বস্তুর অ্যারে থাকার খুব সাধারণ নয় বিশেষ ক্ষেত্রে instanceof
একটি উচ্চ কার্যকারিতা বিকল্প সরবরাহ করে।
যদি obj
টাইপের মতো int[]
বলতে হয়, তবে এটির একটি অ্যারে থাকবে Class
তবে এটির উদাহরণ হবে না Object[]
। সুতরাং আপনি কি করতে চান obj
। আপনি যদি এটি কাস্ট করতে যাচ্ছেন তবে সাথে যান instanceof
। আপনি যদি প্রতিবিম্ব ব্যবহার করতে চলেছেন, তবে ব্যবহার করুন .getClass().isArray()
।
getClass().isArray()
আইবিএমের চেয়ে সান জাভা 5 বা 6 জেআরই-তে উল্লেখযোগ্যভাবে ধীর।
এত বেশি যে ব্যবহার clazz.getName().charAt(0) == '['
করা সান জেভিএম-তে দ্রুত।
আমি সম্প্রতি isArray()
জেডিকে ৫ থেকে জেডিকে to এ একটি গ্রোভির অ্যাপ্লিকেশন আপগ্রেড করার একটি সমস্যায় পড়েছি J
MissingMethodException:
No signature of sun.reflect.generics.reflectiveObjects.GenericArrayTypeImpl.isArray() ...
এটি instanceof Object[]
স্থির করে দেওয়া হচ্ছে ।
isArray
একটি পদ্ধতি Class
, না Type
, অবশ্যই GenericArrayTypeImpl
সেই পদ্ধতিটি নেই। এবং getClass
কখনই কোনও নন- ফিরিয়ে দিতে পারে না Class
Type
, সুতরাং আপনি (বা গ্রোভি ??) অবশ্যই এটি পেতে Type
কোনও ভুল করেছেন, যেমন ধরুন প্রত্যেকটি একটি Class
।
জাভা অ্যারের প্রতিচ্ছবি এমন কেসগুলির জন্য যেখানে আপনার কাছে "উদাহরণস্বরূপ" চালু করার জন্য ক্লাসের কোনও উদাহরণ উপস্থিত নেই। উদাহরণস্বরূপ, আপনি যদি কিছু ধরণের ইনজেকশন কাঠামো লিখছেন, যা মানটিকে কোনও শ্রেণির নতুন উদাহরণে সংযুক্ত করে, যেমন জেপিএ করে, তবে আপনাকে isArray () কার্যকারিতা ব্যবহার করতে হবে।
আমি ডিসেম্বর এর আগে এই সম্পর্কে ব্লগ। http://blog.adamsbros.org/2010/12/08/java-array-reflection/
আপনার যদি কখনও প্রতিফলনমূলক সমাধান এবং অ-প্রতিবিম্বিত সমাধানের মধ্যে পছন্দ থাকে, তবে প্রতিচ্ছবিটিকে কখনও বাছাই করুন না (শ্রেণীর বিষয়গুলি জড়িত)। এটি "ভুল" বা যে কোনও কিছু নয়, তবে প্রতিচ্ছবি জড়িত কোনও কিছুই সাধারণত কম স্পষ্ট এবং কম পরিষ্কার হয় is
দুজনের মধ্যে (স্পষ্ট নাল-কেস ব্যতীত) আমি খুঁজে পেতে পারি এমন আচরণের মধ্যে কোনও পার্থক্য নেই। কোন সংস্করণ পছন্দ করতে হিসাবে, আমি দ্বিতীয় সঙ্গে যেতে হবে। এটি জাভাতে এটি করার মানক উপায়।
যদি এটি আপনার কোডের পাঠকদের বিভ্রান্ত করে (কারণ String[] instanceof Object[]
এটি সত্য), আপনি যদি কোড পর্যালোচকেরা এটি সম্পর্কে জিজ্ঞাসা করে থাকেন তবে আপনি প্রথমে আরও স্পষ্ট হতে ব্যবহার করতে চাইতে পারেন।