জাভা অ্যারের প্রতিচ্ছবি: উদাহরণস্বরূপ অ্যারে অ্যারে


উত্তর:


203

বেশিরভাগ ক্ষেত্রে, আপনার ব্যবহার করা উচিত 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কোনও উপাদান ধরণের জন্য ফিরে আসবে ।


7
হ্যাঁ, তবে এটি কতটা পার্থক্য আনতে চলেছে? এটি আমার কাছে একটি মাইক্রো-অপ্টিমাইজেশনের মতো শোনাচ্ছে।
মাইকেল ম্যাইইয়ার্স

2
@Dims আপনি যে দাবী হয় obj instanceof int[]উৎপাদনের falseযখন আপনি একটি দায়িত্ব অর্পণ int[]করতে obj, আপনি ভুল করছেন।
এরিকসন

4
দুঃখিত আমি বোঝাতে চেয়েছি যে যদি obj instanceof Object[]ফলন । falseObject obj = new int[7]
দিমস

3
ঠিক আছে, জাভাতে, প্রাথমিক তথ্য প্রকারগুলি বস্তু নয় এবং প্রসারিত হয় না java.lang.Object, যাতে এটি বোঝা যায়। তবে instanceofএখনও আদিম অ্যারে পরীক্ষার জন্য ব্যবহার করা যেতে পারে।
এরিকসন

4
-1: সাধারণভাবে, যেহেতু আদিম অ্যারে হয় কলিং অ্যারে isArray()ব্যবহার করা উচিত। কেবলমাত্র বস্তুর অ্যারে থাকার খুব সাধারণ নয় বিশেষ ক্ষেত্রে instanceofএকটি উচ্চ কার্যকারিতা বিকল্প সরবরাহ করে।
স্যাম হারওয়েল

33

পরবর্তী ক্ষেত্রে, যদি আপত্তি নাল হয় তবে আপনি একটি নালপয়েন্টার এক্সসেপশন পাবেন না তবে একটি মিথ্যা।


8

যদি objটাইপের মতো int[]বলতে হয়, তবে এটির একটি অ্যারে থাকবে Classতবে এটির উদাহরণ হবে না Object[]। সুতরাং আপনি কি করতে চান obj। আপনি যদি এটি কাস্ট করতে যাচ্ছেন তবে সাথে যান instanceof। আপনি যদি প্রতিবিম্ব ব্যবহার করতে চলেছেন, তবে ব্যবহার করুন .getClass().isArray()


4

getClass().isArray() আইবিএমের চেয়ে সান জাভা 5 বা 6 জেআরই-তে উল্লেখযোগ্যভাবে ধীর।

এত বেশি যে ব্যবহার clazz.getName().charAt(0) == '['করা সান জেভিএম-তে দ্রুত।


10
আপনার কি কোনও পরিসংখ্যান, কেস স্টাডি, বা অন্য কোনও প্রমাণ রয়েছে যার সাথে আপনি লিঙ্ক করতে পারেন?
ডেভিড সিট্রন

4

আমি সম্প্রতি isArray()জেডিকে ৫ থেকে জেডিকে to এ একটি গ্রোভির অ্যাপ্লিকেশন আপগ্রেড করার একটি সমস্যায় পড়েছি J

MissingMethodException:
No signature of sun.reflect.generics.reflectiveObjects.GenericArrayTypeImpl.isArray() ...

এটি instanceof Object[]স্থির করে দেওয়া হচ্ছে ।


এর কোন মানে নেই. isArrayএকটি পদ্ধতি Class, না Type, অবশ্যই GenericArrayTypeImplসেই পদ্ধতিটি নেই। এবং getClassকখনই কোনও নন- ফিরিয়ে দিতে পারে না Class Type, সুতরাং আপনি (বা গ্রোভি ??) অবশ্যই এটি পেতে Typeকোনও ভুল করেছেন, যেমন ধরুন প্রত্যেকটি একটি Class
কাকাকোও

3

জাভা অ্যারের প্রতিচ্ছবি এমন কেসগুলির জন্য যেখানে আপনার কাছে "উদাহরণস্বরূপ" চালু করার জন্য ক্লাসের কোনও উদাহরণ উপস্থিত নেই। উদাহরণস্বরূপ, আপনি যদি কিছু ধরণের ইনজেকশন কাঠামো লিখছেন, যা মানটিকে কোনও শ্রেণির নতুন উদাহরণে সংযুক্ত করে, যেমন জেপিএ করে, তবে আপনাকে isArray () কার্যকারিতা ব্যবহার করতে হবে।

আমি ডিসেম্বর এর আগে এই সম্পর্কে ব্লগ। http://blog.adamsbros.org/2010/12/08/java-array-reflection/


2

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


তবুও, ভাল, "উদাহরণস্বরূপ" হ'ল একধরণের প্রতিবিম্ব (বা, কমপক্ষে, অন্তর্মুখ), তবে আমি আপনার বক্তব্যটি পেয়েছি।
ডেভিড সিট্রন

এছাড়াও, এটি সাধারণত ধীর হয়।
ম্যাড পদার্থবিদ

0

দুজনের মধ্যে (স্পষ্ট নাল-কেস ব্যতীত) আমি খুঁজে পেতে পারি এমন আচরণের মধ্যে কোনও পার্থক্য নেই। কোন সংস্করণ পছন্দ করতে হিসাবে, আমি দ্বিতীয় সঙ্গে যেতে হবে। এটি জাভাতে এটি করার মানক উপায়।

যদি এটি আপনার কোডের পাঠকদের বিভ্রান্ত করে (কারণ String[] instanceof Object[]এটি সত্য), আপনি যদি কোড পর্যালোচকেরা এটি সম্পর্কে জিজ্ঞাসা করে থাকেন তবে আপনি প্রথমে আরও স্পষ্ট হতে ব্যবহার করতে চাইতে পারেন।

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