Java.util.ArrayList নাল যুক্ত করার অনুমতি দেয় কেন?


41

আমি ভাবছি কেন java.util.ArrayListযোগ করতে দেয় null। সেখানে যে কোন ক্ষেত্রে যেখানে আমি যোগ করতে চাই কি nullএকটি থেকে ArrayList?

আমি এই প্রশ্নের জিজ্ঞাসা করছি কারণ একটি প্রকল্প আমরা একটি বাগ যেখানে কিছু কোড যুক্ত হত nullকরতে ArrayListএবং এটি স্পট যেখানে বাগ ছিল কঠিন ছিল। স্পষ্টতই একটি NullPointerExceptionনিক্ষেপ করা হয়েছিল তবে অন্য কোড উপাদানটি অ্যাক্সেস করার চেষ্টা না করা পর্যন্ত। সমস্যাটি কীভাবে কোডটি সনাক্ত করা যায় যা সেই nullবস্তুটি যুক্ত করেছিল । ArrayListকোডগুলি যেখানে উপাদান যুক্ত করা হচ্ছে সেখানে একটি ব্যতিক্রম ছুঁড়ে ফেলা সহজ হত ।


12
পেয়ারা প্রকল্প টি যে বিষয়ে চমত্কার আকর্ষণীয় পৃষ্ঠা (তারা অনুমতি দেয় না nullতাদের সংগ্রহের অধিকাংশ)।
জোচিম সউর

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

2
কেন এটির অনুমতি দেওয়া হবে না সে সম্পর্কে আপনি আরও তথ্য সরবরাহ করতে পারেন? যদি এটি কেবল স্বাদের বিষয় হয়, তবে কম সীমাবদ্ধকেই অগ্রাধিকার দেওয়া উচিত।
মেরে ইনফিনিটাস

সহজ উত্তরটি হ'ল nullজাভাতে হারিয়ে যাওয়া ডেটা উপস্থাপন করার জন্য এটি আপনার ডিফল্ট উপায়, আপনি এটি পছন্দ করেন বা না চান। আসলে অনেক লোক এটি পছন্দ করে না এবং এটিকে কার্যকরী প্রোগ্রামিং-স্টাইলের জিনিসগুলির জন্য একটি আর্গুমেন্ট বানায়। সর্বাধিক উত্সাহিত উত্তর ইস্যুটির সারমর্মটি বোঝায় না / বোঝায় না।
এক্সজি

@ জিক্সিয়াং আপনি যা করছেন তার nullচেয়ে বেশি বোঝাচ্ছেন । "অনুপস্থিত" হ'ল এর কয়েকটি সম্ভাব্য ব্যাখ্যার মধ্যে একটি null। অন্যান্য বৈধ ব্যাখ্যা "অজানা," "প্রযোজ্য নয়," বা "একীকরণবিহীন" হতে পারে। যা nullউপস্থাপন করে তা আবেদনের উপর নির্ভর করে। পাইথন সম্প্রদায় যেমন বলবে, "অস্পষ্টতার মুখে অনুমান করার প্রলোভনটি অস্বীকার করুন।" এমন ধারকটিতে নালাকে ধরে রাখতে অস্বীকার করা যা এটির জন্য পুরোপুরি সক্ষম just এটিই হবে - একটি ধারণা।
রিওয়াল্ক

উত্তর:


34

এই নকশার সিদ্ধান্তটি বেশিরভাগ নামকরণ দ্বারা চালিত হয়।

নাম অ্যারেলিস্ট পাঠকদের অ্যারের অনুরূপ একটি কার্যকারিতাটি পড়ার পরামর্শ দেয় - এবং জাভা সংগ্রহের ফ্রেমওয়ার্ক ডিজাইনারদের পক্ষে প্রত্যাশা করা যে এপিআই ব্যবহারকারীদের সিংহভাগ ব্যবহারকারী অ্যারেগুলির মতো একইভাবে কাজ করে তার উপর নির্ভর করবেন।

এটি বিশেষত নাল উপাদানগুলির চিকিত্সার সাথে জড়িত। নীচে ঠিক আছে যে এপিআই ব্যবহারকারী জানেন:

array[0] = null; // NPE won't happen here

হবে বেশ অবাক খুঁজে বের করতে যদি ArrayList জন্য অনুরূপ কোড NPE নিক্ষেপ হবে:

arrayList.set(0, null); // NPE => WTF?

উপরের মত যুক্তি JCF টিউটোরিয়াল স্ট্রেসিং পয়েন্টগুলিতে উপস্থাপন করা হয়েছে যা অ্যারেলিস্ট এবং প্লেইন অ্যারেগুলির মধ্যে ঘনিষ্ঠ মিলের পরামর্শ দেয়:

অ্যারেলিস্ট ... ধ্রুবক স্থিতিকালীন অ্যাক্সেসের প্রস্তাব দেয় এবং কেবল সাধারণ দ্রুত ...

আপনি যদি তালিকার প্রয়োগটিকে নালগুলি না মঞ্জুর NonNullableArrayListকরতে চান তবে এপিআই ব্যবহারকারীদের বিভ্রান্তি এড়ানোর জন্য এটির মতো বা এটির মতো কিছু বলা হবে ।


পার্শ্ব নোট এখানে নীচের মন্তব্যগুলিতে একটি সহায়ক আলোচনা আছে, অতিরিক্ত বিবেচনার সাথে এখানে যুক্তি সমর্থন।


12
এই ব্যাখ্যাটি একটি বিশ্বাসী না হয়, বিবেচনা করা যে LinkedList এছাড়াও সমর্থন nullতালিকা এন্ট্রি।
স্টিফেন সি

12
হ্যাঁ ... তবে একটি সহজ এবং (আইএমও) আরও প্রশংসনীয় ব্যাখ্যা হ'ল nullএন্ট্রিগুলিকে প্রচুর ক্ষেত্রে কার্যকর করা যায়।
স্টিফেন সি

7
অ্যারেলিস্টকে এর মতো বলা হয় না কারণ এটি একটি অ্যারের নকল করে। এটিকে বলা হয় কারণ এটি অ্যারে হিসাবে প্রয়োগ করা একটি তালিকা। যেমন একটি ট্রিম্যাপ গাছের মতো আচরণ করে না।
ফ্লোরিয়ান এফ

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

8
এই উত্তরটি সরল ভুল। একটি তালিকা বাস্তবায়নে নালগুলি মঞ্জুর করা সম্পর্কে এটি কেবল অসমর্থিত অনুমানমূলক কাজ। এখানে জাভা সংগ্রহগুলির এক রাউন্ডআপটি নালগুলি মঞ্জুরি / বাতিল করার অনুমতি দেয়; অ্যারেগুলির সাথে মিলের সাথে এটির কোনও সম্পর্ক নেই তা লক্ষ্য করুন ।
আন্দ্রেস এফ।

32

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

আপনি যদি নালগুলি যুক্ত হওয়ার অনুমতি না দিতে চান তবে আপনি ন্যাপটি যুক্ত হওয়ার পরে ছুড়ে ফেলেছিলেন এমন আপনার নিজের মোড়কের সাহায্যে অ্যারে তালিকাটি মোড়ানো করতে পারেন।


2
এটি নালকে কেন অনুমতি দেওয়া উচিত তার একটি খারাপ উদাহরণ বলে মনে হচ্ছে - তালিকার নাল মানগুলি ব্যবহার করার চেয়ে dataচ্ছিক ডেটা উপস্থাপনের আরও ভাল উপায় রয়েছে।
ক্যাসাব্ল্যাঙ্কা

@ ক্যাসাব্লাঙ্কা হ্যাঁ পুরোপুরি একমত, এটি দুর্দান্ত উদাহরণ নয়।
স্যাম হোল্ডার


7
@ ক্যাসাব্ল্যাঙ্কা আমি যখন আপনার সাথে একমত হই যে জাভাতে আরও ভাল বা খারাপের জন্য optionচ্ছিক তথ্য উপস্থাপনের জন্য নালগুলি এড়ানো উচিত, এটি "traditionalতিহ্যবাহী"।
user949300

2
একটি শক্ত ব্যবহারের ক্ষেত্রে: আপনি কিছু গতিশীল ফাংশনে একটি তালিকা হিসাবে পরামিতিগুলি পাস করতে চান। আপনার বিভিন্ন প্যারামিটারগুলির বিভিন্ন সেট সহ কয়েকটি ফাংশন রয়েছে, সুতরাং আপনার গতিশীল আকারের অ্যারে প্রয়োজন এবং আপনি সর্বদা একটি বৈধ ফাংশন আর্গুমেন্ট হিসাবে নাল পাস করতে পারেন!
ফ্যালকো

19

ArrayListনকশা দ্বারা নাল অনুমতি দেয়। এটা ইচ্ছাকৃত। জাভাডোক থেকে :

"[অ্যারেলিস্ট হ'ল তালিকা ইন্টারফেসের পুনরায় আকার পরিবর্তনযোগ্য-অ্যারে বাস্তবায়ন all সমস্ত বিকল্প listচ্ছিক তালিকা ক্রিয়াকলাপ কার্যকর করে এবং নাল সহ সমস্ত উপাদানকে অনুমতি দেয় " "

"কেন" এর উত্তর হ'ল এটি যদি অ্যারেলিস্ট না করে nullতবে তালিকায় একটি তালিকা রাখা প্রয়োজন এমন ক্ষেত্রে ব্যবহারযোগ্য হবে না । বিপরীতে, আপনি কোনও অ্যারেলিস্টকে মানগুলি যুক্ত করার আগে বা এটির দ্বারা বাধা দেয় এমন একটি মোড়ক ব্যবহার করে নালগুলি সংযুক্ত করে আটকাতে পারবেন।

এমন কোনও মামলা আছে যেখানে আমি একটি অ্যারেলিস্টে নাল যুক্ত করতে চাই?

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

অ্যারেলিস্ট উপাদানগুলিকে যুক্ত করা হচ্ছে এমন কোডটিতে একটি ব্যতিক্রম ছুঁড়ে ফেললে এটি আরও সহজ হত।

আপনি একটি রেপার ক্লাস তৈরি করে সহজেই সেই আচরণটি বাস্তবায়ন করতে পারেন। তবে বেশিরভাগ প্রোগ্রামার / অ্যাপ্লিকেশনগুলির প্রয়োজন এমন আচরণ নয় ।


8

এমন কোনও মামলা আছে যেখানে আমি একটি অ্যারেলিস্টে নাল যুক্ত করতে চাই?

অবশ্যই, প্রাক বরাদ্দ সম্পর্কে কি? আপনি এমন একটি ArrayListজিনিস চান যা আপনি এখনও তৈরি করতে পারবেন না কারণ আপনার কাছে পর্যাপ্ত তথ্য নেই। শুধু কারণ যে কেউ কেউ কিছু করতে চাইলে এটি কোনও খারাপ ধারণা তৈরি করে না সে কারণটি আপনি ভাবতে পারেন না। যাই হোক. (এখন, আমি নিশ্চিত যে কেউ আসবেন এবং বলবেন যে এর পরিবর্তে আপনার খালি জিনিস থাকতে হবে যা তারা কিছু অস্পষ্ট ব্লগের উপর পড়ার কিছু প্যাটার্নটি পূরণ করে এবং প্রোগ্রামাররা সত্যই কোনও ifবিবৃতি ব্যবহার না করেই প্রোগ্রাম লিখতে সক্ষম হবে , বেলা বেলা।)

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


1
আপনার পূর্বনির্ধারিত যুক্তিটি অবৈধ, কারণ এটি ইতিমধ্যে ensureCapacity(int minCapacity)পদ্ধতি এবং ArrayList(int initialCapacity)নির্মাণকারীর সাহায্যে অ্যারেলিস্টে তৈরি ।
ফিলিপ

7
@ ফিলিপ এই জায়গাতে কী মান রাখবে?
জেমস

সুস্পষ্ট পছন্দটি হ'ল nullপ্রাক-বরাদ্দকৃত (তবে এখনও অব্যবহৃত হিসাবে ) প্রবেশগুলিতে একটি রাখা ArrayList; তবে আমরা এটি করতে ensureCapacityপারি এবং এখনও অন্য ক্রিয়াকলাপগুলিকে setএটি করার অনুমতি দিচ্ছি না । অন্যত্র দেওয়া কারণগুলি আরও দৃ stronger় বলে মনে হয়।
ডেভিড কে

@ ডেভিডকে: এটা বোঝা যায় যে এটি setকোনও আইটেমের দ্বারা যে কোনও মূল্য দিয়ে ফেরত যেতে পারে তা সম্ভব হওয়া উচিত get। এমনকি যদি এমন getকোনও আইটেমের জন্য সাধারণ চেষ্টা করা হয় যার জন্য স্থান বরাদ্দ করা হয়েছিল তবে কখনও লেখা হয়নি তবে ফিরে আসার পরিবর্তে ব্যতিক্রম ছুঁড়ে ফেলা উচিত null, তবুও এক জোড়া পদ্ধতি ব্যবহার করা দরকারী list1.setOrEraseIfNull(index, list2.getOrReturnNull(index))যা প্রয়োজনের পরিবর্তে অনুমতি দেবেif (list2.valueSet(index)) list1.set(index, list2.get(index)); else list1.unset(index);
সুপারক্যাট

1
@ ডেভিডকে: এমন একটি এন্ট্রি পড়ার চেষ্টা করা হচ্ছে যা বরাদ্দ করা হয়েছে তবে এখনও লিখিত হয়নি, হয় নালার ফলস্বরূপ বা একটি ব্যতিক্রম ছুঁড়ে ফেলতে হবে; এটি নালায় ফিরে আসা সহজ।
সুপারক্যাট

4

এটি এখানে (সফ্টওয়্যার) দার্শনিক প্রশ্ন বেশি বলে মনে হচ্ছে।

ArrayList ইউটিলিটি শ্রেণিটি সম্ভাব্য ব্যবহারের ক্ষেত্রে বিস্তৃত প্রসঙ্গে সহায়ক হতে নকশাকৃত।

আপনার লুকানো দাবির বিপরীতে যে নালকে বৈধ মান হিসাবে গ্রহণ করা নিরুৎসাহিত করা উচিত, এমন অনেকগুলি উদাহরণ রয়েছে যেখানে নাল মান পুরোপুরি আইনী।

একক সবচেয়ে গুরুত্বপূর্ণ কারণ যে nullহয় do not knowফ্রেমওয়ার্ক ধরনের সহ যেকোন রেফারেন্স ধরন, এর সমতুল্য। এটি বোঝায় যে nothingমানটির আরও সাবলীল সংস্করণ দ্বারা কোনও ক্ষেত্রে নালকে প্রতিস্থাপন করা যাবে না ।

সুতরাং, আসুন আমরা এটির সূচকগুলিতে আপনার অ্যারেলিস্টে পূর্ণসংখ্যা 1, 3, 7 সঞ্চয় করি: কিছু গণনার কারণে আপনি সূচক 5 এ উপাদানটি পেতে চান, সুতরাং আপনার অ্যারেটি কী ফিরে আসবে তা হ'ল: "কোনও মান সঞ্চিত নয়"। নাল বা একটি নলবজেক্ট ফেরতের মাধ্যমে এটি অর্জন করা যেতে পারে । বেশিরভাগ ক্ষেত্রে বিল্ট ইন নাল ভ্যালু ফিরিয়ে দেওয়া যথেষ্ট পরিমাণে অভিব্যক্তিপূর্ণ। এমন কোনও পদ্ধতি কল করার পরে যা নাল ফিরে আসতে পারে এবং তার ফেরত মানটি ব্যবহার করে নলের বিরুদ্ধে প্রত্যাবর্তিত মানের একটি চেক আধুনিক কোডে বেশ সাধারণ।


4

বিবৃতি

File f = null;

বৈধ এবং দরকারী (আমি কেন তা ব্যাখ্যা করার প্রয়োজন বলে মনে করি না)। ফাইলগুলির সংকলন থাকা একইভাবে দরকারী, যার মধ্যে কয়েকটি শূন্য হতে পারে।

List<File> files = new ArrayList<File>();
// use my collection of files
// ....
// not using this one anymore:
files.set(3, null);

নাল বস্তু থাকতে পারে এমন সংগ্রহগুলির কার্যকারিতা সরাসরি শূন্য হতে পারে এমন বস্তুগুলির কার্যকারিতা থেকে এগিয়ে আসে। এটি সত্যিই হিসাবে সহজ।


2

সীমাবদ্ধ হওয়ার চেয়ে সব কিছু মেনে নেওয়া সহজ, এবং তারপরে সত্যতার পরে আপনার নকশাটি খোলার চেষ্টা করুন।

উদাহরণস্বরূপ, তারা যদি কেবল সূর্য / সূর্যকে কেবল অ-ননযোগ্যআরলিলিস্ট সরবরাহ করে তবে আপনি আপনার তালিকায় একটি নাল যুক্ত করতে সক্ষম হতে চেয়েছিলেন what তুমি এটা কি ভাবে করবে? আপনাকে সম্ভবত পুরোপুরি আলাদা অবজেক্ট তৈরি করতে হবে, আপনি নন-অ্যালবায়ারলাই তালিকাটি প্রসারিত করতে পারবেন না। পরিবর্তে যদি আপনার কাছে অ্যারেলিস্ট থাকে যা সমস্ত কিছু নিয়ে যায় তবে আপনি সহজেই এটিকে প্রসারিত করতে এবং অ্যাডটিকে ওভাররাইড করতে পারেন যেখানে এটি নাল মান গ্রহণ করে না।


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

2
তবে আমি একমত। এটি সর্বাধিক কার্যকারিতা সম্পর্কে। আপনি এমন একটি তালিকা ব্যবহার করতে পারেন যা নালগুলি গ্রহণ করে এমনকি আপনার প্রয়োজনও নেই। নালগুলির প্রয়োজন হলে আপনি কোনও তালিকা নালাকে প্রত্যাখ্যান করতে পারবেন না।
ফ্লোরিয়ান এফ

-1

নাল ব্যবহার্যতা?

যখন আপনি বিভিন্ন পজিশনের সাথে 2 ডি রিয়েল লাইফ প্লেট মডেল করতে তালিকাগুলির তালিকাসহ যান তখন খুব বেশি তাই । এর মধ্যে অর্ধেক পজিশন খালি থাকতে পারে (এলোমেলো স্থানাঙ্কে) যদিও ভরাটগুলি কোনও সাধারণ ইনট বা স্ট্রিং প্রতিনিধিত্ব করে না তবে কোনও জটিল অবজেক্ট দ্বারা প্রতিনিধিত্ব করে। আপনি যদি অবস্থান সম্পর্কিত তথ্য রাখতে চান, আপনার শূন্য দাগগুলি শূন্য দিয়ে পূরণ করতে হবে যাতে আপনার list.get (x) .get (y)বাজে আশ্চর্য হতে না। নাল ব্যতিক্রমগুলি মোকাবেলার জন্য আপনি নাল (খুব জনপ্রিয়) জন্য পরীক্ষা করতে পারেন বা আপনি একটি ptionচ্ছিক ব্যবহার করতে পারেন (যা আমি এই ক্ষেত্রে কার্যকর মনে করি)। বিকল্পটি হ'ল "আবর্জনা" অবজেক্টগুলির সাথে খালি দাগগুলি পূরণ করা যা রাস্তায় সমস্ত ধরণের গোলযোগ সৃষ্টি করতে পারে। যদি আপনার নাল চেক ব্যর্থ হয় বা কোথাও ভুলে যায় তবে জাভা আপনাকে জানিয়ে দেবে। অন্যদিকে "জাঙ্ক" প্লেসোল্ডার অবজেক্ট যা সঠিকভাবে পরীক্ষা করা হয়নি তা অযত্নে পাস হতে পারে।

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