আমরা জাভা ডিজাইনাররা ডিজাইনের সময় আসলে কী ভাবছিলাম তা নিশ্চিত হতে পারি না Stringতবে আমরা স্ট্রিং অপরিবর্তনীয়তা থেকে বেরিয়ে আসা সুবিধার ভিত্তিতে কেবল এই কারণগুলি উপসংহার করতে পারি, যার মধ্যে কয়েকটি হ'ল
1. স্ট্রিং কনস্ট্যান্ট পুলের অস্তিত্ব
স্ট্রিং কনস্ট্যান্ট পুল নিবন্ধে স্ট্রিং কেন স্ট্রোক করা হয়েছে তাতে আলোচিত হিসাবে , প্রতিটি অ্যাপ্লিকেশন অনেকগুলি স্ট্রিং অবজেক্ট তৈরি করে এবং জেভিএমকে প্রথমে প্রচুর স্ট্রিং অবজেক্ট তৈরি করা থেকে বাঁচাতে এবং তারপরে আবর্জনা সংগ্রহের জন্য। জেভিএম স্ট্রিং ধ্রুবক পুল নামক একটি পৃথক মেমরি অঞ্চলে সমস্ত স্ট্রিং অবজেক্টগুলিকে সঞ্চয় করে এবং সেই ক্যাশেড পুল থেকে অবজেক্টগুলিকে পুনরায় ব্যবহার করে।
যখনই আমরা একটি স্ট্রিং আক্ষরিক জেভিএম তৈরি করি প্রথমে দেখি যে সেই আক্ষরিকটি ইতিমধ্যে ধ্রুবক পুলে উপস্থিত রয়েছে কিনা এবং যদি সেখানে থাকে তবে নতুন রেফারেন্স এসসিপিতে একই বস্তুর দিকে ইশারা করা শুরু করবে।
String a = "Naresh";
String b = "Naresh";
String c = "Naresh";
মান সহ উপরোক্ত উদাহরণে স্ট্রিং বস্তু Nareshশুধুমাত্র একবার SCP- র তৈরি করা হবে এবং সমস্ত রেফারেন্স a, b, cএকই বস্তুর কিন্তু কি নির্দেশ যদি আমরা পরিবর্তন করতে চেষ্টা করবে aযেমন a.replace("a", "")।
আদর্শভাবে, aমান থাকতে হবে Nreshতবে b, cঅপরিবর্তিত থাকতে হবে কারণ শেষ ব্যবহারকারী হিসাবে আমরা aকেবলমাত্র পরিবর্তন করছি । আমরা জানি a, b, cসব একই বস্তুর প্রতি নির্দেশ করা হয় তাই যদি আমরা পরিবর্তন করতে a, যাতে অন্যরা পরিবর্তন প্রতিফলিত হওয়া উচিত।
তবে স্ট্রিং অপরিবর্তনীয়তা আমাদের এই দৃশ্য থেকে বাঁচায় এবং স্ট্রিং অবজেক্টের স্ট্রিং অবজেক্টের অপরিবর্তনীয়তার কারণে Nareshকখনও পরিবর্তন হবে না। সুতরাং যখন আমরা aস্ট্রিং অবজেক্টের পরিবর্তে কোনও পরিবর্তন করি তখন NareshJVM একটি নতুন অবজেক্ট তৈরি করে aএবং তারপরে সেই বস্তুটিতে পরিবর্তন আনতে পারে।
সুতরাং স্ট্রিং পুলটি কেবল স্ট্রিংয়ের অপরিবর্তনীয়তার কারণেই সম্ভব এবং স্ট্রিং যদি অপরিবর্তনীয় না হত, তবে স্ট্রিং অবজেক্টগুলিকে ক্যাশে করা এবং তাদের পুনরায় ব্যবহার করার কোনও সম্ভাবনা থাকত না কারণ কোনও পরিবর্তনশীল হ'ল মান পরিবর্তন করে এবং অন্যকে দূষিত করেছিল।
আর এ কারণেই এটি জেভিএম খুব বিশেষভাবে পরিচালনা করে এবং একটি বিশেষ স্মৃতি অঞ্চল দেওয়া হয়েছে।
2. থ্রেড সুরক্ষা
কোনও বস্তুকে থ্রেড-সেফ বলা হয় যখন একাধিক থ্রেড এটিতে কাজ করে তবে এগুলির কোনওটিই তার স্থিতিটিকে দূষিত করতে সক্ষম হয় না এবং কোনও সময়ে সময়ে প্রতিটি থ্রেডের জন্য অবজেক্ট একই অবস্থা ধারণ করতে সক্ষম হয়।
যেহেতু আমরা একটি অপরিবর্তনীয় বস্তুটিকে তার তৈরির পরে কারও দ্বারা সংশোধন করা যায় না যা প্রতিটি অপরিবর্তনীয় বস্তুকে ডিফল্টরূপে থ্রেডে সুরক্ষিত করে তোলে। আমাদের এতে কোনও থ্রেড সুরক্ষা ব্যবস্থা প্রয়োগ করার দরকার নেই যেমন সিঙ্ক্রোনাইজড পদ্ধতি তৈরি করা।
সুতরাং তার অপরিবর্তনীয় প্রকৃতির কারণে স্ট্রিং অবজেক্ট একাধিক থ্রেড দ্বারা ভাগ করা যায় এবং এমনকি যদি এটি অনেক থ্রেড দ্বারা ম্যানিপুলেট করা হয়ে থাকে তবে এটির মান পরিবর্তন হবে না।
3. সুরক্ষা
প্রতিটি অ্যাপ্লিকেশনগুলিতে, আমাদের বেশিরভাগ গোপনীয়করণগুলি পাস করতে হবে যেমন ব্যবহারকারীর ব্যবহারকারীর নাম \ পাসওয়ার্ড, সংযোগ ইউআরএল এবং সাধারণভাবে, এই সমস্ত তথ্য স্ট্রিং অবজেক্ট হিসাবে পাস করা হয়।
এখন ধরুন যদি স্ট্রিং প্রকৃতিতে পরিবর্তনযোগ্য না হয়ে থাকে তবে এটি প্রয়োগের জন্য গুরুতর সুরক্ষা হুমকির কারণ হতে পারে কারণ এই মানগুলি পরিবর্তিত হতে দেওয়া হয় এবং যদি এটি অনুমোদিত হয় তবে ভুলভাবে লিখিত কোড বা অন্য কোনও ব্যক্তির কারণে এগুলি পরিবর্তন হতে পারে আমাদের পরিবর্তনশীল রেফারেন্স অ্যাক্সেস আছে।
4. ক্লাস লোডিং
উদাহরণ হিসাবে জাভায় প্রতিবিম্বের মাধ্যমে অবজেক্ট তৈরির ক্ষেত্রে যেমন আলোচনা করা হয়েছে , আমরা Class.forName("class_name")মেমরির এমন একটি ক্লাস লোড করার জন্য পদ্ধতিটি ব্যবহার করতে পারি যা আবার অন্য পদ্ধতিগুলিকে এটি করতে ডাকে। এমনকি জেভিএম ক্লাসগুলি লোড করার জন্য এই পদ্ধতিগুলি ব্যবহার করে।
তবে আপনি যদি স্পষ্টভাবে দেখতে পান যে এই সমস্ত পদ্ধতি ক্লাসের নামটিকে স্ট্রিং অবজেক্ট হিসাবে গ্রহণ করে যাতে স্ট্রিংস জাভা বর্গ লোডিংয়ে ব্যবহৃত হয় এবং অপরিবর্তনীয়তা সুরক্ষা দেয় যা সঠিক বর্গ দ্বারা লোড হচ্ছে ClassLoader।
মনে করুন স্ট্রিং যদি অচল না হয়ে থাকে এবং আমরা লোড করার চেষ্টা করছি java.lang.Objectযা org.theft.OurObjectএর মধ্যে পরিবর্তিত হয় এবং এখন আমাদের সমস্ত বস্তুর এমন আচরণ রয়েছে যা কেউ অযাচিত জিনিসগুলিতে ব্যবহার করতে পারে।
5. হ্যাশকোড ক্যাচিং
যদি আমরা কোনও বস্তুর উপর কোনও হ্যাশিং সম্পর্কিত ক্রিয়াকলাপ করতে চলেছি তবে আমাদের অবশ্যই hashCode()পদ্ধতিটিকে ওভাররাইড করতে হবে এবং অবজেক্টের অবস্থা ব্যবহার করে একটি সঠিক হ্যাশকোড তৈরি করার চেষ্টা করতে হবে। যদি কোনও সামগ্রীর অবস্থা পরিবর্তন হয়ে যায় যার অর্থ হ্যাশকোডও পরিবর্তন হওয়া উচিত।
কারণ স্ট্রিং অপরিবর্তনীয় তাই মান একটি স্ট্রিং অবজেক্টটি যে মান ধারণ করে তা কখনই পরিবর্তিত হবে না যার অর্থ এর হ্যাশকোডও পরিবর্তন হবে না যা স্ট্রিং ক্লাসকে বস্তু তৈরির সময় তার হ্যাশকোড ক্যাশে যাওয়ার সুযোগ দেয়।
হ্যাঁ, স্ট্রিং অবজেক্ট তার হ্যাশকোডটিকে বস্তু তৈরির সময় ক্যাশে করে যা হ্যাশ সম্পর্কিত সম্পর্কিত ক্রিয়াকলাপের জন্য এটি দুর্দান্ত প্রার্থী করে কারণ হ্যাশকোডকে আবার গণনা করার দরকার নেই যা আমাদের কিছুটা সময় সাশ্রয় করে। এই কারণেই স্ট্রিং বেশিরভাগ HashMapকী হিসাবে ব্যবহৃত হয় ।
জাভাতে স্ট্রিং কেন অপরিবর্তনীয় এবং চূড়ান্ত তা আরও পড়ুন ।