জাভাতে আদিম বনাম শ্রেণি কখন ব্যবহার করবেন?


54

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



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

উত্তর:


47

কার্যকর জাভার আইটেম 5-এ, জোশুয়া ব্লচ বলেছেন

পাঠটি স্পষ্ট: বাক্সিত আদিমদের চেয়ে আদিমকে পছন্দ করুন এবং অজান্তে অটোবক্সিংয়ের জন্য নজর রাখুন

ক্লাস জন্য এক ভাল ব্যবহার যখন তাদের ব্যবহার জেনেরিক ধরনের (যেমন তালিকা এবং মানচিত্র সংগ্রহ ক্লাস, সহ) হিসাবে অথবা আপনি (অন্তর্নিহিত ঢালাই ছাড়া অন্য ধরনের তাদের রুপান্তর করতে চান যখন উদাহরণস্বরূপ হয় Integerবর্গ পদ্ধতি আছে doubleValue()বা byteValue()

সম্পাদনা: জোশুয়া ব্লচের কারণ:

// Hideously slow program! Can you spot the object creation?
public static void main(String[] args) {
    Long sum = 0L;
    for (long i = 0; i < Integer.MAX_VALUE; i++) {
         sum += i;
    }
    System.out.println(sum);
}

এই প্রোগ্রামটি সঠিক উত্তর পেয়েছে, তবে এক-চরিত্রের টাইপোগ্রাফিক ত্রুটির কারণে এটি হওয়া উচিত তার চেয়ে অনেক ধীর। চলকটি suma এর Longপরিবর্তে ঘোষিত হয় long, যার অর্থ প্রোগ্রামটি প্রায় 2 ^ 31 অপ্রয়োজনীয় Longদৃষ্টান্ত তৈরি করে (মোটামুটি প্রতিবারের long iসাথে যুক্ত হওয়ার সাথে সাথে একটি Long sum) one থেকে সমষ্টি ঘোষণা পরিবর্তন Longকরতে long43 সেকেন্ড থেকে আমার মেশিনে 6.8 সেকেন্ড রানটাইম হ্রাস করা হয়।


2
আপনি যদি ব্লচের কারণগুলি তালিকাভুক্ত না করে কেবল তার উপসংহারের উদ্ধৃতি দিয়ে থাকেন তবে এটি সাহায্য করবে!
ওয়াঘানড্রয়েড

@ বাউকেটা আমি পোস্টটি সম্পাদনা করেছি। কারণটি হল পারফরম্যান্স।
m3th0dman

এটি কিছুটা পরিষ্কার, ধন্যবাদ। আমি এখন আমার নিজের উত্তর পোস্ট করার ক্ষেত্রে ন্যায়সঙ্গত বোধ করছি। :)
ওয়াঘানড্রয়েড

আপনি লেম্যাক্স আর্কিটেকচারটিকে আকর্ষণীয় মনে করতে পারেন - "আরও একটি চৌর্যবৃত্তির পরিমাণ নিয়ে আরেকটি চৌকসতা লাগল। বেশ কয়েকটি জিনিস যা এলএমএক্স দল সেখানে পৌঁছতে সহায়ক বলে মনে করেছিল One ক্যাশে-বন্ধুত্বপূর্ণ এবং আবর্জনা সঙ্গে সতর্কতা অবলম্বন করা আবশ্যক। এর একটা উদাহরণ ব্যবহার করছে আদিম জাভা জন্য longs একটি বিশেষভাবে লিখিত অ্যারে ব্যাক ম্যাপ বাস্তবায়ন hashmap কী হিসেবে । "

দেখে মনে হচ্ছে জেআইটি হ্যান্ডেল করা উচিত
deFreitas

28

স্ট্যান্ডার্ড অনুশীলনটি হ'ল আদিমদের সাথে চলুন, যদি না আপনি জেনেরিকদের সাথে কাজ করে থাকেন (নিশ্চিত করুন যে আপনি অটোবক্সিং এবং আনবক্সিং সম্পর্কে সচেতন !)।

সম্মেলনটি অনুসরণ করার বেশ কয়েকটি ভাল কারণ রয়েছে:

1. আপনি সাধারণ ভুল এড়ানো:

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

সর্বাধিক সাধারণ ভুল a == bপরিবর্তে ব্যবহার করা হয় a.equals(b)। মানুষ a == bআদিম সঙ্গে কাজ করতে অভ্যস্ত তাই আপনি যখন বস্তু মোড়ক ব্যবহার করছেন এটি সহজেই হয়ে যায়।

Integer a = new Integer(2);
Integer b = new Integer(2);
if (a == b) { // Should be a.equals(b)
    // This never gets executed.
}
Integer c = Integer.valueOf(2);
Integer d = Integer.valueOf(2);
if (c == d) { // Should be a.equals(b), but happens to work with these particular values!
    // This will get executed
}
Integer e = 1000;
Integer f = 1000;
if (e == f) { // Should be a.equals(b)
    // Whether this gets executed depends on which compiler you use!
}

২. পাঠযোগ্যতা:

নিম্নলিখিত দুটি উদাহরণ বিবেচনা করুন। বেশিরভাগ লোক বলে যে দ্বিতীয়টি আরও বেশি পঠনযোগ্য।

Integer a = 2;
Integer b = 2;
if (!a.equals(b)) {
    // ...
}
int c = 2;
int d = 2;
if (c != d) {
    // ...
}

3. কর্মক্ষমতা:

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

নুথের "... প্রায় 97% সময় বলুন: অকালীন অপ্টিমাইজেশন হ'ল সমস্ত মন্দের মূল" উদ্ধৃতিটি এখানে সত্যিই প্রয়োগ হয় না। তিনি সেই অপটিমাইজেশন সম্পর্কে কথা বলছিলেন যা কোডটি (বা সিস্টেম) আরও জটিল করে তুলেছে - আপনি যদি পয়েন্ট # 2 এর সাথে একমত হন তবে এটি একটি অপ্টিমাইজেশন যা কোডটি কম জটিল করে তোলে !

৪. এটি কনভেনশন:

আপনি যদি অন্য জাভা প্রোগ্রামারদের 99% থেকে আলাদা স্টাইলিস্টিক পছন্দ করেন তবে 2 টি ডাউনসাইড রয়েছে:

  • আপনি অন্য ব্যক্তির কোড পড়তে আরও কঠিন পাবেন। এখানে 99% উদাহরণ / টিউটোরিয়াল / ইত্যাদির আদিম ব্যবহার হবে। আপনি যখনই একটি পড়েন তখন আপনার নিজের ব্যবহার করা স্টাইলে এটি কীভাবে দেখাবে তা ভেবে অতিরিক্ত জ্ঞানীয় ওভারহেড পাবেন।
  • অন্যান্য লোকেরা আপনার কোডটি পড়তে আরও কঠিন। আপনি যখনই স্ট্যাক ওভারফ্লোতে প্রশ্ন জিজ্ঞাসা করছেন আপনাকে "আপনি আদিম ব্যবহার করছেন না কেন?" জিজ্ঞাসা করে উত্তর / মন্তব্যগুলি সন্ধান করতে হবে। আপনি যদি আমাকে বিশ্বাস না করেন, কেবল ব্র্যাককেট প্লেসমেন্টের মতো জিনিসগুলির জন্য লোকেরা যে লড়াইগুলি করেছে সেগুলি দেখুন, যা উত্পন্ন কোডকেও প্রভাবিত করে না!

সাধারণত আমি কিছু পাল্টা পয়েন্ট তালিকাবদ্ধ করতাম, তবে আমি কনভেনশনটিতে না যাওয়ার জন্য কোনও ভাল কারণ সম্পর্কে সত্যই ভাবতে পারি না!


2
লোকদের সাথে বস্তুর তুলনা করতে স্যাগেজেট করবেন না ==। বিষয়গুলির সাথে তুলনা করা উচিত equals()
তুলাইনস কর্ডোভা

2
@ user61852 আমি এটি করার মতো জিনিস হিসাবে পরামর্শ দিচ্ছিলাম না, তবে এটি একটি সাধারণ ভুল হিসাবে করা হয়েছে! আমাকে কি আরও পরিষ্কার করা উচিত?
ভাগানড্রয়েড

হ্যাঁ, আপনি উল্লেখ করেন না যে অবজেক্টগুলির সাথে শোরগোলের তুলনা করা যায় equals()... আপনি তাদেরকে একটি কার্যনির্বাহ প্রদান করেন যাতে ==প্রত্যাশিত ফলাফলের সাথে বস্তুর তুলনা করলে ফল পাওয়া যায়।
তুলাইনস কর্ডোভা

ভাল যুক্তি. এটা পরিবর্তন।
ভাগানড্রয়েড

আমি equals()দ্বিতীয় কোড স্নিপেটে যুক্ত করেছি এবং আমার ভোট পরিবর্তন করেছি।
Tulains কর্ডোভা

12

সাধারণত আমি আদিমদের সাথে যাই। যাইহোক, ক্লাসগুলি ব্যবহার করার মতো একটি বিশেষত্ব Integerএবং সেই ভেরিয়েবলগুলিকে Booleanবরাদ্দ nullকরার সম্ভাবনা । অবশ্যই, এর অর্থ এই যে আপনাকে nullসর্বদা চেক করতে হবে, তবে কিছু intবা booleanভেরিয়েবল ব্যবহারের কারণে লজিক ত্রুটি থাকার চেয়ে নলপয়েন্টারএক্সসেপশন পাওয়ার চেয়ে ভাল যা সঠিকভাবে শুরু হয়নি।

অবশ্যই জাভা 8 এর পরে আপনি এক ধাপ এগিয়ে যেতে পারেন (এবং সম্ভবত হওয়া উচিত) উদাহরণস্বরূপ Integerআপনি Optional<Integer>ভেরিয়েবলগুলির জন্য ব্যবহার করতে পারেন যার মান থাকতে পারে বা নাও পারে।

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


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

@ সিএইচও তবে ভেরিয়েবলটি আরম্ভ করার মতো কোনও বুদ্ধিমান ডিফল্ট মান না থাকলে কী হবে ? আপনি এটি সেট করতে পারেন 0.0, বা -1, বা Integer.MAX_VALUE, বা False, কিন্তু শেষ পর্যন্ত আপনি জানেন না যে এটি ডিফল্ট মান, বা একটি আসল মান যা সেই ভেরিয়েবলের জন্য নির্ধারিত হয়েছিল। এটি গুরুত্বপূর্ণ যেখানে ক্ষেত্রে একটি nullমান থাকা আরও পরিষ্কার হতে পারে।
টোবিয়াস_কে

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

আমি @cHao বোঝানো, মামলা আছে যেখানে আপনি হতে পারে না পারেন পরিবর্তনশীল আরম্ভ এবং আপনি আছে রানটাইম এ মোকাবেলা। এই ধরনের ক্ষেত্রে, "নাল" এর মতো একটি "ডিফল্ট", যেটি স্পষ্টভাবে ডিফল্ট হিসাবে চিহ্নিত করা যেতে পারে, বা "আনইনটিলাইজড", কোনও সংকলন-সময় সূচনার চেয়ে ভাল হতে পারে যা বৈধ মানও হতে পারে।
tobias_k

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

2

সাধারণ মানুষের কথায়:

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

সংগ্রহগুলি আদিমকে ধরে রাখতে পারে না।


0

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

একটি সাধারণ নিয়ম হিসাবে, আপনার যখনই সম্ভব দেশীয় ডেটা ধরণের ব্যবহার করার চেষ্টা করা উচিত।

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