কেন জাভা সংগ্রহগুলি সরাসরি প্রিমিটিভের ধরণের সঞ্চয় করতে পারে না?


123

জাভা সংগ্রহগুলি কেবলমাত্র বস্তুগুলিকে সঞ্চয় করে, আদিম ধরণের নয়; তবে আমরা র‌্যাপার ক্লাস সঞ্চয় করতে পারি।

কেন এই বাধা?


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

প্রযুক্তিগতভাবে, আদিম প্রকারগুলি হ'ল অবজেক্টস (সিঙ্গলটন উদাহরণ যেমন সঠিক হতে পারে), সেগুলি কেবল একটি দ্বারা সংজ্ঞায়িত করা হয় না class, বরং জেভিএম দ্বারা। বিবৃতিটি জেভিএম-এ int i = 1সংজ্ঞায়িত বস্তুর সিঙ্গেলটন দৃষ্টান্তের পয়েন্টারকে সংজ্ঞায়িত intকরে, জেভিএম-এর 1কোথাও সংজ্ঞায়িত মানকে সেট করে । হ্যাঁ, জাভাতে পয়েন্টার - ভাষা প্রয়োগের মাধ্যমে এটি কেবল আপনার থেকে দূরে রয়েছে। প্রিমিটিভগুলি জেনেরিক্স হিসাবে ব্যবহার করা যায় না কারণ ভাষাটি ভবিষ্যদ্বাণী করে যে সমস্ত জেনেরিক প্রকারগুলি অবশ্যই সুপার টাইপের হতে পারে Object- তাই রান-টাইমে A<?>সংকলন কেন A<Object>
রবার্ট ই ফ্রাই

1
@ রবার্টইফ্রি আদিম ধরণ জাভাতে অবজেক্ট নয় , তাই সিঙ্গেলটন দৃষ্টান্তগুলি এবং এগুলি সম্পর্কে আপনি যা লিখেছেন তা মূলত ভুল এবং বিভ্রান্তিকর। আমি জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশনের "প্রকার, মান এবং পরিবর্তনশীল" অধ্যায়টি পড়ার পরামর্শ দিচ্ছি , যা কোনও বস্তুটি কী তা সংজ্ঞায়িত করে: "একটি বস্তু (§4.3.1) একটি শ্রেণির ধরণের বা গতিশীলভাবে তৈরি অ্যারেটির গতিশীলভাবে তৈরি করা উদাহরণ। "
টাইপরেসার

উত্তর:


99

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

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

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

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

বক্সিং সম্পর্কে এসও সম্পর্কে একটি ভাল ব্যাখ্যা: কিছু ভাষার কেন বক্সিং এবং আনবক্সিংয়ের প্রয়োজন?

এবং জাভা জেনেরিকের সমালোচনা: কেন কেউ কেউ দাবি করেন যে জাভা জেনেরিকের প্রয়োগ খারাপ?

জাভার প্রতিরক্ষা ক্ষেত্রে, পিছনের দিকে তাকানো এবং সমালোচনা করা সহজ। জেভিএম সময়ের পরীক্ষা সহ্য করেছে, এবং এটি অনেক দিক থেকে একটি ভাল নকশা।


6
কোনও ভুল নয়, সাবধানতার সাথে নির্বাচিত ট্রেড অফ যা আমার বিশ্বাস জাভা খুব ভালভাবে পরিবেশন করেছে।
ডিজেক্লেওয়ার্থ

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

2
@ মির্জোল্টকোলা: আইএমএইচও, ডিফল্ট অটোবক্সিং একটি ভুল, তবে ভেরিয়েবল এবং পরামিতিগুলিকে ট্যাগ করার একটি উপায় থাকা উচিত ছিল যা তাদের দেওয়া মানগুলিকে স্বয়ংক্রিয়ভাবে বাক্স হওয়া উচিত। এখনও, আমি মনে করি যে নির্দিষ্ট ভেরিয়েবল বা প্যারামিটারগুলি নতুন-অটো-বাক্সিত মানগুলি গ্রহণ করবে না তা উল্লেখ করার জন্য একটি উপায় যুক্ত করা উচিত [উদাহরণস্বরূপ , বক্সযুক্ত পূর্ণসংখ্যা চিহ্নিতকারী Object.ReferenceEqualsধরণের রেফারেন্সগুলি পাস করা আইনী হওয়া উচিত Object, তবে এটি আইনী হওয়া উচিত নয় একটি পূর্ণসংখ্যার মান পাস করুন]। জাভার স্ব-আনবক্সিং IMHO ঠিক খারাপ।
সুপারক্যাট

18

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

আপনি এটি করতে পারেন, অবশ্যই, কেবল জিএনইউ ট্র্যাভ , অ্যাপাচি কমন্স প্রিমিটিভস বা এইচপিপিসি দেখুন

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


11

এটি দুটি সত্যের সমন্বয়:

  • জাভা আদিম ধরণের রেফারেন্স ধরণের নয় (যেমন একটি intএটি নয় Object)
  • জাভা রেফারেন্স প্রকারের টাইপ-মুছে ফেলা ব্যবহার করে জেনেরিকগুলি করে (উদাহরণস্বরূপ , রান-টাইমে List<?>সত্যিকার অর্থে এটি List<Object>)

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

এটা কি এড়ানো যেত? সম্ভবত।

  • যদি এটি একটি intহয় Objectতবে বাক্সের ধরণের জন্য কোনও প্রয়োজন নেই।
  • জেনেরিকগুলি যদি টাইপ-ইরেজর ব্যবহার করে না করা হয়, তবে প্রারম্ভিকগুলি টাইপ পরামিতিগুলির জন্য ব্যবহার করা যেতে পারে।

8

অটো-বক্সিং এবং অটো-আনবক্সিংয়ের ধারণা রয়েছে । আপনি যদি জাভা সংকলকটিতে intএকটি সংরক্ষণের চেষ্টা করেন List<Integer>তবে এটি স্বয়ংক্রিয়ভাবে এটিকে রূপান্তর করবে Integer


1
জেনারিক্সের সাথে জাভা 1.5 তে অটোবক্সিং চালু হয়েছিল।
জেরেমি

1
তবে এটি একটি সংকলন সময় জিনিস; কর্মক্ষমতা সুবিধা ছাড়াই সিনট্যাক্স চিনি। জাভা সংকলক অটোবক্স, অতএব ভিএম বাস্তবায়নের তুলনায় পারফরম্যান্স পেনাল্টি। নেট যেমন জেনেরিক্স বক্সিং জড়িত না।
কোডেনহেম

1
@ মির্জোল্টকোলা: আপনার বক্তব্য কী? আমি শুধু ঘটনা ভাগ করে নিচ্ছিলাম, তর্ক করছিলাম না।
জেরেমি

3
সিনট্যাক্স এবং পারফরম্যান্সের মধ্যে পার্থক্যটি উল্লেখ করা আমার বক্তব্যটি গুরুত্বপূর্ণ। আমি আমার মতামতকে সত্য ঘটনা ভাগ করে নেওয়ার বিষয়টি বিবেচনা করি, যুক্তি নয়। ধন্যবাদ।
কোডেনহেম

2

এটা কি আসলেই বাধা নয়?

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

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


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

আমি জাভা ছয় বছরে খুব কমই আদিমদের একটি संग्रह সঞ্চয় করতে চেয়েছিলাম। এমনকি কয়েকটি ক্ষেত্রে যেখানে আমি রেফারেন্স অবজেক্টগুলি ব্যবহার করার জন্য অতিরিক্ত সময় এবং স্থান ব্যয় করতে চেয়েছি তা নগণ্য ছিল। বিশেষত আমি দেখতে পেয়েছি যে অনেক লোক মনে করে তারা মানচিত্র << টি, টি> চায় তা ভুলে গিয়ে যে কোনও অ্যারে খুব সুন্দরভাবে এই কৌশলটি করবে।
ডিজেক্লেওয়ার্থ

2
@ ডিজেক্লেওয়ার্থ মূল মানগুলি অকার্যকর হলেই কেবল এটি কার্যকর হবে। অবশ্যই, কীগুলি ট্র্যাক করতে আপনি একটি সহায়ক অ্যারে ব্যবহার করতে পারেন, তবে এটির নিজস্ব সমস্যা রয়েছে: অপেক্ষাকৃত দক্ষ অ্যাক্সেসের জন্য বাইনারি অনুসন্ধানের অনুমতি দেওয়ার জন্য মূল আদেশের উপর ভিত্তি করে উভয় অ্যারে বাছাই করা দরকার যা ফলস্বরূপ সন্নিবেশ এবং মুছে ফেলা হবে সন্নিবেশ / মোছার ধরণটি অকার্যকর না হলে যেমন deletedোকানো আইটেমগুলি শেষ হওয়ার সম্ভাবনা থাকে যেখানে পূর্বে মুছে ফেলা আইটেমটি ছিল এবং / অথবা কিছু বাফারগুলি অ্যারেগুলিতে ছেদ করা হয় ইত্যাদি resources সংস্থানগুলি পাওয়া যায় তবে এতে থাকা ভাল লাগবে জাভা নিজেই।
জ্যাব

@ জ্যাব প্রকৃতপক্ষে এটি কি ঠিক রাখে যদি কীগুলি খুব কম থাকে তবে এটি অপ্রয়োজনীয় নয় তার চেয়ে বেশি মেমরির প্রয়োজন। এবং যদি তারা কীগুলি খুব কম হয় তবে এর দ্বারা বোঝা যায় যে এগুলির মধ্যে অনেকগুলি নেই এবং পূর্ণসংখ্যাটি কী হিসাবে ব্যবহৃত হয়। যে কোনও পদ্ধতির জন্য কমপক্ষে স্মৃতি দরকার Use অথবা আপনি যদি মনে করেন না তবে যত্ন নেই।
ডিজেক্লেওয়ার্থ

0

আমি মনে করি আমরা সম্ভবত JDK- এ এই JEP - http://openjdk.java.net/jeps/218 এর উপর ভিত্তি করে জাভা 10-তে এই স্থানের অগ্রগতি দেখতে পাচ্ছি ।

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

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


0

মূল কারণটি হচ্ছে জাভা ডিজাইনের কৌশল। ++ 1) সংগ্রহগুলিতে হেরফেরের জন্য অবজেক্টের প্রয়োজন হয় এবং আদিম বস্তু থেকে উত্পন্ন হয় না তাই এটি অন্য কারণ হতে পারে। 2) জাভা আদিম ডেটা প্রকারের জন্য রেফারেন্স টাইপ নয়। int কোন অবজেক্ট নয়।

জয়লাভ করা:-

আমাদের কাছে অটো-বক্সিং এবং অটো-আনবক্সিংয়ের ধারণা রয়েছে। সুতরাং আপনি যদি আদিম ডেটা ধরণের সঞ্চয় করার চেষ্টা করছেন তবে সংকলক স্বয়ংক্রিয়ভাবে এটিকে সেই আদিম ডেটা শ্রেণীর অবজেক্টে রূপান্তরিত করবে।

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