এটি একটি সুন্দর নিবন্ধ যা উপরের উত্তরগুলিতে ইতিমধ্যে উল্লিখিত দুটি কারণের রূপরেখা দেয়:
- সুরক্ষা : সিস্টেমগুলি কেবলমাত্র পঠনযোগ্য তথ্যের সংবেদনশীল বিটগুলি তাদের পরিবর্তন করা হবে তা ভেবে উদ্রেক করতে পারে
- পারফরম্যান্স : অপরিবর্তনীয় ডেটা জিনিসগুলিকে থ্রেড-সেফ তৈরিতে খুব দরকারী।
এবং এটি সম্ভবত এই নিবন্ধে সর্বাধিক বিস্তারিত মন্তব্য। এটি জাভা এবং সুরক্ষা সংক্রান্ত সমস্যার স্ট্রিং পুলের সাথে সম্পর্কিত do স্ট্রিং পুলে কী কী হবে তা কীভাবে সিদ্ধান্ত নেবেন সে সম্পর্কে এটি। উভয় স্ট্রিং সমান যদি তাদের অক্ষরের ক্রম একই হয় তবে ধরে নেওয়া উচিত যে সেখানে প্রথমে কে পৌঁছেছে এবং এর সাথে সুরক্ষার সমস্যা রয়েছে সে সম্পর্কে আমাদের একটি রেস শর্ত রয়েছে। যদি তা না হয়, তবে স্ট্রিং পুলটিতে অপ্রয়োজনীয় স্ট্রিং থাকবে যাতে এটি প্রথম স্থানে থাকার সুবিধা হারাবে। শুধু নিজের জন্য এটি পড়ুন, তাই না?
স্ট্রিং প্রসারিত করা সমান এবং ইন্টার্নের সাথে সর্বনাশ করবে। জাভাডক সমান বলে:
এই স্ট্রিংটি নির্দিষ্ট বস্তুর সাথে তুলনা করে। ফলাফলটি সত্য যদি এবং শুধুমাত্র যদি যুক্তিটি শূন্য না হয় এবং একটি স্ট্রিং অবজেক্ট যা এই অবজেক্টের মতো অক্ষরের একই ক্রমকে উপস্থাপন করে।
ধরে java.lang.Stringনেওয়া চূড়ান্ত ছিল না, একটি SafeStringসমান হতে পারে Stringএবং তদ্বিপরীত; কারণ তারা চরিত্রগুলির একই ক্রমের প্রতিনিধিত্ব করবে।
যদি আপনি প্রয়োগ কি হবে internএকটি থেকে SafeString- would SafeStringজেভিএম এর স্ট্রিং পুকুর ঢোকা? ClassLoaderএবং সমস্ত বস্তু SafeStringতারপর জেভিএম এর জীবনকাল জন্য জায়গায় লক হবে অনুষ্ঠিত রেফারেন্স। চরিত্রগুলির অনুক্রমের মধ্যে প্রথমটি কে হতে পারে সে সম্পর্কে আপনি একটি দৌড়ের শর্তটি পেয়ে SafeStringযাবেন - সম্ভবত আপনার জিততে পারে, সম্ভবত এ String, বা SafeStringকোনও ভিন্ন শ্রেণি লোডার দ্বারা বোঝা (সম্ভবত একটি পৃথক শ্রেণি)।
আপনি যদি পুলটিতে দৌড়ে জয়ী হন তবে এটি সত্য সিঙ্গলটন হবে এবং লোকেরা প্রতিচ্ছবি এবং এর মাধ্যমে আপনার পুরো পরিবেশ (স্যান্ডবক্স) অ্যাক্সেস করতে পারে secretKey.intern().getClass().getClassLoader()।
অথবা জেভিএম পুলটিতে কেবল কংক্রিট স্ট্রিং অবজেক্ট (এবং কোনও সাবক্ল্যাস) যুক্ত করা হয়নি তা নিশ্চিত করে এই গর্তটিকে অবরুদ্ধ করতে পারে।
যদি সমানগুলি এমনভাবে প্রয়োগ করা হয় SafeString! = Stringতাহলে SafeString.intern! = String.intern, এবং SafeStringসেটিকে পুলে যোগ করতে হবে। পুলটি তার <Class, String>পরিবর্তে একটি পুল হয়ে উঠবে <String>এবং আপনার যে পুলটিতে প্রবেশ করতে হবে তা হ'ল একটি নতুন শ্রেণির লোকে।