সংগ্রহসমূহ.এম্পটিম্যাপ () বনাম নতুন হ্যাশম্যাপ ()


143

কিছু পরিস্থিতি যেখানে আমি ব্যবহার করতে পারি Collections.emptyMap()? ডকুমেন্টেশন বলছে যে আমি যদি আমার সংগ্রহটি পরিবর্তনযোগ্য হতে চাই তবে আমি এই পদ্ধতিটি ব্যবহার করতে পারি।

আমি কেন একটি অপরিবর্তনীয় খালি সংগ্রহ চাই? আসলকথা কি?


12
প্রশ্নের +1 কারণ আমি এর আগে কখনও স্থির পদ্ধতিটি দেখিনি
টিম বেন্ডার

আপনার স্ক্যালাল লেন্সগুলি গুগল স্কালার লেন্সগুলি দেখতে পাবেন । খালি ম্যাপ এবং অপরিবর্তনীয় মানচিত্র অবজেক্টযোগ্য বস্তু তৈরি করতে ব্যবহার করা যেতে পারে। খালি ম্যাপ হল প্রাথমিক পয়েন্ট। প্রতিবার কোনও উপাদান যুক্ত হওয়ার সাথে সাথে মানচিত্রটি পুরানো উপাদান এবং নতুন উপাদানযুক্ত মানচিত্রের দ্বারা প্রতিস্থাপন করা হয়। মুল বক্তব্যটি হ'ল, অবজেক্টে অ্যাক্সেস করা নিরাপদ।
মাইকেল_স

1
এটি অবজেক্টিভ-সি এর মতো [NSArray array], এটি এমন একটি বস্তু প্রদান করে যা ব্যবহারযোগ্য না হলেও বিদ্যমান। সুতরাং আপনি এটির সাথে সাধারণ অবজেক্টের মতো খেলতে পারেন এবং কোনও ত্রুটি পেতে পারেন না।
শেন হু

উত্তর:


144

থেকে কার্যকর জাভা , আইটেমটি # 43 - "Return empty arrays or collections, not null"একটি খালি সংগ্রহ ফেরার প্রমান এবং সম্ভবত এমনকি এই ব্যবহার প্রমান emptyList(), emptySet()এবং emptyMap()সংগ্রহগুলি বর্গ উপর পদ্ধতি একটি খালি সংগ্রহে এছাড়াও অপরিবর্তনীয় হচ্ছে বাড়তি সুবিধা আছে যা জন্য। থেকে # 15 আইটেম "Minimize Mutability"

সংগ্রহগুলি থেকে খালি সেট-সংগ্রহ-খালি তালিকা-সংগ্রহ

এটি এক ধরণের প্রোগ্রামিং আইডিয়াম। এটি এমন লোকদের জন্য যা নাল ভেরিয়েবলগুলি চায় না। সুতরাং সেটটি আরম্ভ করার আগে তারা খালি সেটটি ব্যবহার করতে পারে।

দ্রষ্টব্য: নীচের কোডটি কেবল একটি উদাহরণ (আপনার ব্যবহারের ক্ষেত্রে এটি পরিবর্তন করুন):

private Set myset = Collections.emptySet();

void initSet() {
   myset = new HashSet();
}
void deleteSet() {
   myset = Collections.emptySet();
}

এই পদ্ধতিগুলি বেশ কয়েকটি সুবিধা দেয়:

  1. এগুলি আরও সংক্ষিপ্ত কারণ আপনার সংগ্রহের জেনেরিক প্রকারটি স্পষ্টভাবে টাইপ করার দরকার নেই - এটি সাধারণত পদ্ধতি কলের প্রেক্ষাপট থেকে অনুমান করা হয়।

  2. তারা আরও দক্ষ কারণ তারা নতুন বস্তু তৈরি করতে বিরক্ত করে না; তারা কেবল একটি বিদ্যমান খালি এবং অপরিবর্তনীয় বস্তু পুনরায় ব্যবহার করে। এই প্রভাবটি সাধারণত খুব সামান্য, তবে এটি মাঝে মধ্যে (ভাল, খুব কমই) গুরুত্বপূর্ণ।


15
কার্যকর জাভা রেফারেন্সের জন্য +1। একটি নিট: আমি প্যারামিটারাইজিং Setএবং HashSetআপনার উদাহরণগুলিতে সুপারিশ করব , যেহেতু emptySet()পদ্ধতি এবং বন্ধুদের পুরো বিষয়টি (ধ্রুবকগুলির বিপরীতে Collections.EMPTY_SET) হ'ল তারা জেনেরিকের সাথে দুর্দান্ত খেলছে। এছাড়াও, একটি বৈশিষ্ট্য (কাঁচা ধরণের) ব্যবহার করা যা জাভা 5-এর পরে অবনমিত করা হয়েছে কোনও ভাল শিক্ষণ সহায়তা নয়।
ড্যানিয়েল প্রাইডেন

4
আমি অপ্রকাশিত রয়েছি ... নিম্নলিখিত ক্রিয়াকলাপগুলি ছুঁড়ে এড়ানো Collectionপরিবর্তে একটি ব্যবহার করার সম্পূর্ণ পয়েন্টটি কি নয় ? অপরিবর্তনীয় সংগ্রহটি ব্যবহার করার ফলে আমি কল্পনা করি এমন কিছু ব্যতিক্রম ঘটবে। এবং কার্যনির্বাহী অবশ্যই অপরিবর্তনীয় ধ্রুবককে অর্পণ করার চেয়ে কম দক্ষ নয়। nullExceptionsnull
fgysin

14
@fgysin: আপনার যদি এমন একটি এপিআই থাকে যেখানে ক্লায়েন্টরা সংগ্রহটি পরিবর্তন করতে পারে এমন প্রত্যাশা থাকে, তবে হ্যাঁ, কোনও অপরিবর্তনীয় সংগ্রহটি ফিরিয়ে দেওয়া কোনও মানে হয় না। তবে আপনার যদি এমন কোনও এপিআই থাকে যেখানে আপনি কোনও সংগ্রহ ফিরিয়ে দেন যা ক্লায়েন্টদের অবশ্যই সংশোধন করা উচিত নয় এবং কেবল পুনরাবৃত্তি হওয়া উচিত, তারপরে অন্তর্নিহিত সংগ্রহটিতে একটি দৃশ্য ফিরিয়ে দেওয়া কোনও "খারাপ" ক্লায়েন্টকে দুর্ঘটনাক্রমে মালিকানাধীন সংগ্রহগুলি সংশোধন করে না তা নিশ্চিত করার জন্য সঠিক ধারণা তৈরি করে তোমার দ্বারা. শূন্যের পরিবর্তে খালি সংগ্রহ ফিরিয়ে নেওয়ার অর্থ হল ক্লায়েন্ট কোডটি পরিষ্কার করে আপনার ক্লায়েন্টকে সংগ্রহটি ব্যবহারের আগে নাল চেক করতে হবে না।
জিন হোমিনাল

4
public boolean setExists() { return !myset.equals(Collections.emptySet()); }
assylias

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

33

এটি আমার ব্যক্তিগত অভিজ্ঞতায় স্বীকারোক্তিযুক্ত, এমন ক্ষেত্রে খুব দরকারী যেখানে কোনও এপিআই-র জন্য প্যারামিটার সংগ্রহ প্রয়োজন, তবে আপনার সরবরাহ করার মতো কিছুই নেই। উদাহরণস্বরূপ আপনার এমন একটি এপিআই থাকতে পারে যা দেখতে এরকম কিছু দেখায় এবং নাল রেফারেন্সের অনুমতি দেয় না:

public ResultSet executeQuery(String query, Map<String, Object> queryParameters);

যদি আপনার কাছে এমন কোনও কোয়েরি থাকে যা কোনও প্যারামিটার নেয় না, তবে এটি অবশ্যই হ্যাশম্যাপ তৈরি করতে কিছুটা অপব্যয়কারী, যাতে অ্যারে বরাদ্দ করা জড়িত থাকে, যখন আপনি কেবল 'খালি মানচিত্র' এ যেতে পারেন যা কার্যকরভাবে একটি ধ্রুবক, এটি যেভাবে কার্যকর করা হয় মধ্যে java.util.Collections


22

আমি কেন একটি অপরিবর্তনীয় খালি সংগ্রহ চাই? আসলকথা কি?

এখানে দুটি ভিন্ন ধারণা রয়েছে যা একসাথে দেখলে অদ্ভুত প্রদর্শিত হয়। আপনি দুটি ধারণাকে পৃথকভাবে চিকিত্সা করার সময় এটি আরও অর্থবোধ করে।

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

  • দ্বিতীয়ত, আপনার একটি সেন্ডিনেল হিসাবে নাল ব্যবহার করার চেয়ে খালি সংগ্রহ ব্যবহার করা পছন্দ করা উচিত। এটি এখানে ভালভাবে বর্ণনা করা হয়েছে । এর অর্থ হ'ল আপনার কাছে বাগ পরিষ্কার করার জন্য কম জায়গা সহ অনেক ক্লিনার, কোড বোঝা সহজ।

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


8

এমন বেশ কয়েকটি কেস রয়েছে যেখানে আপনি অপরিবর্তনীয় মানচিত্র, তালিকা, সেট বা অন্যান্য ধরণের সংগ্রহ ব্যবহার করতে পছন্দ করবেন using

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

এই ক্ষেত্রে, আমি এগুলির অপরিবর্তনীয় সংস্করণগুলিতে ফিরে আসতে পছন্দ করি কারণ এটি কোনও গণনার ফলাফলের প্রকৃত অপরিবর্তনীয়তা আরও স্পষ্টভাবে প্রতিফলিত করে - আপনি ডেটা নিয়ে পরবর্তী সময়ে যা কিছু করেন না কেন, আপনার কোয়েরি থেকে প্রাপ্ত ফলাফলের সেটটি আপনার উচিত নয় পরিবর্তন.

দ্বিতীয় সাধারণ ব্যবহারের ক্ষেত্রে হ'ল যখন আপনাকে কোনও পদ্ধতি বা পরিষেবাতে ইনপুট হিসাবে যুক্তি সরবরাহ করতে হয়। আপনি যদি না প্রত্যাশা করেন যে ইনপুট সংগ্রহটি পরিষেবা বা পদ্ধতিতে (যা সাধারণত একটি সত্যই খারাপ নকশার ধারণা) দ্বারা পরিবর্তিত হয়, তবে পরিবর্তনীয় পরিবর্তে অপরিবর্তনীয় সংগ্রহে পাস করা অনেক ক্ষেত্রে যুক্তিসঙ্গত এবং নিরাপদ পছন্দ হতে পারে।

আমি এটি "মান দ্বারা পাস" কনভেনশন হিসাবে মনে করি ।

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

এর একটি খুব উপকারী পার্শ্ব প্রতিক্রিয়া হিসাবে আপনার মডিউল / পরিষেবাগুলির সুরক্ষা এবং থ্রেড সুরক্ষা বৃদ্ধি পেয়েছে এবং উদ্বেগের পরিষ্কার বিচ্ছিন্নতা নিশ্চিত করে।

Collections.empty*()পদ্ধতিগুলি ব্যবহারের আর একটি ভাল কারণ হ'ল তাদের ভারবোসেসের লক্ষণীয় অভাব। জাভা-পূর্বের যুগে আপনার যদি জেনেরিক সংগ্রহ থাকে তবে আপনাকে জেনেরিক ধরণের টীকাগুলি পুরো জায়গাতে ছিটিয়ে দিতে হয়েছিল।

কেবলমাত্র এই দুটি ঘোষণার তুলনা করুন:

Map<Foo, Comparable<? extends Bar>> fooBarMap = new HashMap<Foo, Comparable<? extends Bar>>();

বনাম:

Map<Foo, Comparable<? extends Bar>> fooBarMap = Collections.emptyMap();

দ্বিতীয়টি স্পষ্টতই দুটি গুরুত্বপূর্ণ উপায়ে পঠনযোগ্যতার উপর হাতছাড়া করে:

  1. প্রথম ঘোষণায়, একটি খালি মানচিত্রের পুরো তাত্ক্ষণিক জেনেরিক প্রকারের ঘোষণার শব্দে কবর দেওয়া হয়, একটি অপরিহার্যভাবে তুচ্ছ ঘোষণাকে এটির চেয়ে অনেক বেশি গোপনীয় করে তোলে।
  2. ডানদিকে জেনেরিক ধরণের টীকাটির উল্লেখযোগ্য অভাব ছাড়াও, দ্বিতীয় সংস্করণে স্পষ্টভাবে বলা হয়েছে যে মানচিত্রটি একটি খালি মানচিত্রে সূচনা করা হয়েছে। তদ্ব্যতীত - এই পদ্ধতিটি একটি অপরিবর্তনীয় মানচিত্রকে ফিরিয়ে দেয় তা জেনেও, এখন সন্ধানের দ্বারা আমার কাছে fooBarMapআর একটি অমূল্য মান নির্ধারিত হচ্ছে এটি সন্ধান করা আরও সহজ /fooBarMap =/

5

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

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


3

এটি কার্যকর হতে পারে যখন আপনার কোনও ফাংশন থাকে যা ফেরত দেয় immutable collectionএবং কিছু পরিস্থিতিতে কোনও ডেটা ফেরত আসে না তাই ফেরার পরিবর্তে nullআপনি ফিরে আসতে পারেনemptyMap()

এটি আপনার কোডটিকে আরও সহজ এবং প্রতিরোধ করে NullPointerException


3

বেশিরভাগ সময় আমরা constructorএকটি নতুন তৈরি করতে ব্যবহার করি empty map। তবে Collections methodsঅফারটি empty mapব্যবহার করে তৈরি করতে বেশ কয়েকটি সুবিধা দেয়static method java.util.Collections.emptyMap()

  1. এগুলি আরও সংক্ষিপ্ত কারণ আপনার সংগ্রহের জেনেরিক প্রকারটি স্পষ্টভাবে টাইপ করার দরকার নেই - এটি সাধারণত পদ্ধতি কলের প্রেক্ষাপট থেকে অনুমান করা হয়।

  2. তারা আরও দক্ষ কারণ তারা নতুন বস্তু তৈরি করতে বিরক্ত করে না; তারা কেবল একটি বিদ্যমান খালি এবং অপরিবর্তনীয় বস্তু পুনরায় ব্যবহার করে। এই প্রভাবটি সাধারণত খুব সামান্য, তবে এটি মাঝে মধ্যে (ভাল, খুব কমই) গুরুত্বপূর্ণ।


2

আমি কেন একটি অপরিবর্তনীয় খালি সংগ্রহ চাই? আসলকথা কি?

একই কারণে আপনি কোনও Collections.unmodifiableMap()সময়ে ব্যবহার করতে চান । আপনি কোনও মানচিত্রের উদাহরণ ফিরিয়ে দিতে চান যা ব্যবহারকারী যদি এটি সংশোধন করার চেষ্টা করে তবে একটি ব্যতিক্রম ছুঁড়ে ফেলে। এটি কেবল একটি বিশেষ ক্ষেত্রে: খালি মানচিত্র।


1

আমি কেন একটি অপরিবর্তনীয় খালি সংগ্রহ চাই? আসলকথা কি?

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

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