কখন র্যাপার ক্লাস এবং আদিম ধরণের ব্যবহার করবেন


101

আমার যখন আদিম ধরণের উপর দিয়ে রেপার ক্লাসে যাওয়া উচিত? বা মোড়ক / আদিম ধরণের মধ্যে কোন পরিস্থিতিতে আমার চয়ন করা উচিত?


4
এই প্রবন্ধটি এই আলোচনার জন্য সহায়ক হবে w
পঙ্কজ

উত্তর:


70

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

আরেকটি বিবেচনা হ'ল:

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

অনেক প্রোগ্রামার এটিকে বোঝাতে 0 (ডিফল্ট) বা -1 এ সংখ্যার সূচনা করে তবে দৃশ্যের উপর নির্ভর করে এটি ভুল বা বিভ্রান্তিকর হতে পারে।

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


15
"অবজেক্টগুলি শূন্য করার জন্য এটি সহজেই কার্যকর হতে পারে"। এটি সুবিধাজনক হতে পারে না কারণ এটি ভুল, ক্ষেত্রটি alচ্ছিক হলে আপনার এটি স্পষ্টভাবে নির্দেশ করতে হবে।
এডি জ্যামেসিওন

8
LOL @ এডি জ্যামেসিওন ধন্যবাদ, আমি আর কখনও শূন্য করতে আরম্ভ করব না। (pfffft)
pstanton

4
@ এডিজ্যামেসিওন যদি আসল মান নির্ধারণের সময় ব্যর্থতা চিহ্নিত করার উপায় হিসাবে অবজেক্টগুলি শূন্য করতে শুরু করে, তবে আপনি আর কীভাবে এই সমস্যাটি ধরার প্রস্তাব করবেন? ওহ, আমি টাইপ করার সাথে সাথে আমি বুঝতে পেরেছি: ব্যতিক্রম। একটি নালপয়েন্টার এক্সসেপশন খুব সাধারণ; কী ভুল হয়েছে তা নির্দেশ করতে খুব নির্দিষ্ট কাস্টম ব্যতিক্রম ব্যবহার করা ভাল be ভাল, আমি এখন থেকে এটি করব ...
klaar

4
@ এডিজ্যামেসিওন বিষয়টি পড়ার পরে, আমি একটি ptionচ্ছিক অবজেক্টের ধারণাটিতে চলে এসেছি। ঠিক।
klaar

@ ক্লার একটি alচ্ছিক বস্তু কি?
carloswm85

18

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


4
পারফরম্যান্স হিট এত দুর্দান্ত নয় যে কোড লেগ্যাবিলিটি / নির্ভরযোগ্যতার পিছনে সিট নেওয়া উচিত।
pstanton

4
প্রথমত, আদিমগুলি যথাযথভাবে ব্যবহার করা আপনার কোডটিকে অযোগ্য করে তুলবে না। দ্বিতীয়ত, কিছু ক্ষেত্রে পারফরম্যান্স হিট তাৎপর্যপূর্ণ। এটা কখনই হয় না তা অবাস্তব।
ম্যাথু ফ্ল্যাশেন

4
@ পিস্ট্যান্টন: দয়া করে কীভাবে Integerআরও সুসংগঠিত তা ব্যাখ্যা করুন int
স্টিফেন সি

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

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

12

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

ঘ।

class Person {
   int SSN ; // gets initialized to zero by default 
}

ঘ।

class PersonBetter {
  Integer SSN; //gets initialized to null by default
}

প্রথম ক্ষেত্রে, আপনি এসএসএন মান নির্বিঘ্নিত রাখতে পারবেন না। আপনি এটি ব্যবহারের চেষ্টা করার আগে মানটি সেট করা হয়েছে কিনা তা যদি আপনি পরীক্ষা না করে থাকেন তবে এটির ক্ষতি হতে পারে।

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


4
বিল্ডার প্যাটার্নটি এটি প্রায় কাছাকাছি পেতে বোঝানো হয়। এই দৃশ্যে, আপনি PersonBuilderএকটি ব্যতিক্রম ছুঁড়ে ফেলুন যদি Personউদাহরণটি পাওয়ার জন্য এসএসএন "বিল্ড" কল করার আগে সেট করা না থাকে । আমি মনে করি এই ধরণের জিনিস অত্যধিক, তবে এটি জাভা ভাষা সঠিক নিদর্শনগুলির জন্য প্রচার করে।
স্যান্ডি চ্যাপম্যান

8

আপনার যদি প্রয়োজন হয় তবে আমি কেবল মোড়কের ধরণগুলি ব্যবহার করব।

এগুলি ব্যবহারের ক্ষেত্রে আপনি যে পরিমাণে তেমন উপকার পাবেন না Objects

এবং, আপনি মেমরির ব্যবহার এবং বক্সিং / আনবক্সিং সময় ব্যয় করে ওভারহেড হারাবেন।


4
আপনি হয়ত খুব বেশি লাভ করতে পারবেন না, তবে আপনিও খুব একটা হারাবেন না। যদি না আপনি 1990 এর পাম পাইলট চালাচ্ছেন।
pstanton

সত্য যে তারা অবজেক্টস এগুলি তাদেরকে সরল আদিম হিসাবে তুলনায় অনেক বেশি প্রসঙ্গ এবং এনক্যাপসুলেশন দেয়। সুতরাং আপনি যে আদিমগুলি বোঝাতে চেয়েছেন এবং সেগুলি কোথায় ব্যবহৃত হচ্ছে তার উপর নির্ভর করে আপনি আসলে অনেক কিছু অর্জন করতে পারেন।
aberrant80

4

কার্যত আমি এমন একটি পরিস্থিতির মুখোমুখি হয়েছিলাম যেখানে মোড়কের ক্লাসের ব্যবহার ব্যাখ্যা করা যেতে পারে।

আমি একটি সার্ভিস ক্লাস তৈরি করেছি যার longটাইপ ভেরিয়েবল ছিল

  1. ভেরিয়েবল টাইপ হয় long - যখন আরম্ভ করা হয় না, তখন এটি 0 তে সেট করা হবে - জিইউআইতে প্রদর্শিত হলে এটি ব্যবহারকারীকে বিভ্রান্ত করবে
  2. চলকটি যদি টাইপের হয় Long- যখন আরম্ভ হয় না, তখন সেট করা থাকবে null- এই নাল মানটি জিইউতে প্রদর্শিত হবে না।

এটি প্রযোজ্য Booleanযেখানে মানগুলি যখন আমরা আদিম ব্যবহার করি তখন আরও বিভ্রান্তিকর হতে পারে boolean(ডিফল্ট মানটি মিথ্যা হিসাবে)।


3

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

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

অবশ্যই পারফরম্যান্স ইস্যু আছে, তবে আমি সঠিক উপাত্ত দিয়ে পারফরম্যান্সটি পরিমাপ করার এবং সমস্যাযুক্ত ক্ষেত্রের দিকে আরও নির্দেশিত ক্রিয়া না করার আগ পর্যন্ত আমার এড়িয়ে যাওয়ার প্রবণতা রয়েছে। কোডটিও বুঝতে সহজ হয় তবে পারফরম্যান্সের বিষয়টি বোঝা আরও সহজ হতে পারে।


3

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

আদিম ধরণের, একটি == অপারেটর ব্যবহার করে তবে মোড়কের জন্য পছন্দসই পছন্দটি সমান () পদ্ধতিতে কল করা।

"আদিম ধরণেরগুলি ক্ষতিকারক হিসাবে বিবেচিত" কারণ তারা "পদ্ধতিগত শব্দার্থকে একটি অন্যথায় অভিন্ন বস্তু-কেন্দ্রিক মডেলের সাথে মিশ্রিত করে।

অনেক প্রোগ্রামার এটিকে বোঝাতে 0 (ডিফল্ট) বা -1 এ সংখ্যার সূচনা করে তবে দৃশ্যের উপর নির্ভর করে এটি ভুল বা বিভ্রান্তিকর হতে পারে।


1

আপনি যদি সংগ্রহগুলি ব্যবহার করতে চান তবে আপনাকে অবশ্যই র্যাপার ক্লাস ব্যবহার করতে হবে

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

অটোবক্সিংয়ের পর থেকে "কখন আদিম বা মোড়ক ব্যবহার করতে হবে" সীমান্তটি বেশ ঝাপসা হয়ে গেছে।

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


সংগ্রহ ব্যতীত, আমার মোড়ক ক্লাস ব্যবহার করা উচিত নয়? এটি পূর্ণসংখ্যা i = নতুন পূর্ণসংখ্যার (10) এর মতো সাধারণ ঘোষণার জন্য কীভাবে ব্যবহার করা যায়; এভাবে করা কি ভাল?
গোপি

অটোবক্সিং আপনাকে পূর্ণসংখ্যা i = 10 করার অনুমতি দেয়;
টম

4
না, শ্রী। আপনার যদি প্রয়োজন হয় না যে আমি কোনও বস্তু হব তবে এটি তৈরি করবেন না।
ম্যাথু ফ্ল্যাশেন

অটোবক্সিং উপরোক্ত ঘোষিত আই টু আই = 10 বা পূর্ণসংখ্যা i = 10 কে আনবক্স করবে?
গোপি

4
int পাই = নতুন পূর্ণসংখ্যা (10); কাজ করে। পূর্ণসংখ্যা oi = 10; কাজ করে। int ni = নাল; কাজ করে না এলএইচএসকে আরএইচএসের যা কিছু প্রয়োজন তা রূপান্তরিত করা হয়।
pstanton

0

আপনি যদি একটি মান টাইপ তৈরি করতে চান। প্রোডাক্ট এসকিউ বা এয়ারপোর্টকোডের মতো কিছু।

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


5
স্ট্রিং কোনও আদিম নয়
pstanton

4
বেস অবজেক্ট হিসাবে একটি স্ট্রিং রয়েছে এমন একটি মান প্রকার মোড়ানোর জন্য এখনও ভাল কারণ রয়েছে।
ক্রিস মিসাল

আপনার উত্তরটি ঠিক বোঝায় না। আমি নিশ্চিত আপনি কি বলছেন না। যদিও আমি আপনার মন্তব্যের সাথে একমত, মোড়ক ক্লাসগুলি যদি সুগঠনতার উন্নতি করে তবে এটি একটি ভাল ধারণা।
pstanton

মান প্রকার বা মান অবজেক্ট তৈরি করা উচিত এবং অপরিবর্তনীয়। উদাহরণস্বরূপ, "কান্ট্রি কোড" "নতুন দেশকোড (" ইউএসএ ") তৈরি করার পরে এটি অন্যভাবে একইভাবে তৈরি করতে হবে, যেখানে পরে তারা আলাদা। এগুলি শুরু করার জন্য কেবল স্ট্রিংস তবে তাদের পিছনে তাদের অর্থ রয়েছে। স্ট্রিংগুলি ব্যবহার করে আপনি এগুলি সংশোধন করতে সক্ষম হবেন (আরও ডেটা সংযোজন করে ইত্যাদি) তবে সেগুলি আর সমান হবে না। আমি কী ব্যাখ্যা করার চেষ্টা করছি তার আরও ভাল বর্ণনার জন্য এই নিবন্ধটি দেখুন :) আমি আশা করি এটি বোধগম্য হবে c2.com/cgi/wiki?ValueObject
ক্রিস মিসাল

0

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

সমস্ত র্যাপার ক্লাস চূড়ান্ত। শুরু করা যেতে পারে এমন সমস্ত র‍্যাপার ক্লাসের অবজেক্টটি অপরিবর্তনীয় যার অর্থ মোড়কের বস্তুর মান পরিবর্তন করা যায় না।

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


0

আদিম প্রকারগুলি কখন ব্যবহার করবেন

  • প্রচুর পরিমাণে গণনা করার সময়, আদিম ধরণের সবসময় দ্রুত হয় - তাদের ওভারহেডের পরিমাণ কম থাকে।
  • যখন আপনি চান না যে ভেরিয়েবলটি নাল হতে সক্ষম হয়।
  • আপনি যখন ডিফল্ট মানটি নালায় চান না।
  • যদি পদ্ধতিটি অবশ্যই একটি মান ফেরত দেয়

র্যাপার ক্লাস কখন ব্যবহার করবেন

  • আপনি যখন সংগ্রহ বা জেনারিকস ব্যবহার করছেন - তখন এটি প্রয়োজন
  • আপনি যদি কোনও প্রকারের MIN_SIZE বা MAX_SIZE চান।
  • যখন আপনি চান ভেরিয়েবলটি নাল হতে সক্ষম হবেন।
  • যখন আপনি ডিফল্ট মানটি নাল হতে চান।
  • যদি কখনও কখনও পদ্ধতিটি একটি নাল মান প্রদান করতে পারে।

থেকে https://medium.com/@bpnorlander/java- સમજ বোঝার -প্রিমিটিভ- টাইপস- এবং- wrapper-objects-a6798fb2afe9

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