পটভূমি
তিনটি জায়গা যেখানে জাভাতে ফাইনাল প্রদর্শিত হতে পারে:
ক্লাস ফাইনাল করা ক্লাসের সমস্ত সাবক্লাসিং বাধা দেয়। কোনও পদ্ধতি চূড়ান্ত করা পদ্ধতিটির উপশ্রেণীটিকে ওভাররাইড করা থেকে বাধা দেয়। ফিল্ড ফাইনাল করা এটিকে পরে পরিবর্তিত হতে বাধা দেয়।
ভ্রান্ত ধারনা
চূড়ান্ত পদ্ধতি এবং ক্ষেত্রগুলিতে ঘটে এমন অপ্টিমাইজেশন রয়েছে।
একটি চূড়ান্ত পদ্ধতি হটস্পটকে ইনলাইনিংয়ের মাধ্যমে অনুকূলকরণ করা সহজ করে। তবে হটস্পট এই পদ্ধতিটি চূড়ান্ত না হলেও এমনটি করে যদিও এটি এই ধারণাটি নিয়ে কাজ করে যে এটি অন্যথায় প্রমাণিত না হওয়া পর্যন্ত ওভাররাইড করা হয়নি।এসও সম্পর্কে আরও
একটি চূড়ান্ত পরিবর্তনশীল আক্রমণাত্মকভাবে অনুকূলিত করা যায় এবং এ সম্পর্কে আরও জেএলএস বিভাগে 17.5.3 পড়তে পারে ।
যাইহোক, যে বোঝার এক সঙ্গে অবগত থাকুন যে হওয়া উচিত তন্ন তন্ন একটি উপার্জন সম্পর্কে এই অপ্টিমাইজেশন হয় বর্গ চূড়ান্ত। ক্লাস ফাইনাল করে কোনও পারফরম্যান্স লাভ নেই।
কোনও শ্রেণীর চূড়ান্ত দিকটির অপরিবর্তনীয়তার সাথে কোনও সম্পর্ক নেই। কারও কাছে অপরিবর্তনীয় শ্রেণি থাকতে পারে (যেমন বিগইন্টিজার ) যা চূড়ান্ত নয়, বা এমন একটি ক্লাস যা পরিবর্তনীয় এবং চূড়ান্ত (যেমন স্ট্রিংবিল্ডার )। কোনও শ্রেণি চূড়ান্ত হওয়া উচিত কিনা সে সম্পর্কে সিদ্ধান্ত ডিজাইনের একটি প্রশ্ন।
চূড়ান্ত নকশা
স্ট্রিংগুলি সর্বাধিক ব্যবহৃত ডেটা ধরণের। এগুলি মানচিত্রের কী হিসাবে পাওয়া যায়, তারা ব্যবহারকারীর নাম এবং পাসওয়ার্ড সংরক্ষণ করে, আপনি যা ওয়েবপৃষ্ঠায় একটি কীবোর্ড বা ক্ষেত্র থেকে পড়েছেন। স্ট্রিংগুলি সর্বত্র রয়েছে ।
মানচিত্র
আপনি যদি স্ট্রিং সাবক্লাস করতে পারতেন তবে প্রথমে কী হবে তা বিবেচনা করার বিষয়টি বুঝতে পারছি যে কেউ মিউটেটেবল স্ট্রিং ক্লাস তৈরি করতে পারে যা অন্যথায় স্ট্রিং হিসাবে উপস্থিত হবে। এটি সর্বত্র মানচিত্রকে বিশৃঙ্খলা করবে।
এই কাল্পনিক কোডটি বিবেচনা করুন:
Map t = new TreeMap<String, Integer>();
Map h = new HashMap<String, Integer>();
MyString one = new MyString("one");
MyString two = new MyString("two");
t.put(one, 1); h.put(one, 1);
t.put(two, 2); h.put(two, 2);
one.prepend("z");
মানচিত্রের সাথে সাধারণভাবে একটি পরিবর্তনীয় কী ব্যবহার করে এটি একটি সমস্যা, তবে আমি যে জিনিসটি সেখানে পৌঁছানোর চেষ্টা করছি তা হঠাৎ মানচিত্রের বিরতি সম্পর্কে অনেকগুলি বিষয়। এন্ট্রি মানচিত্রে আর সঠিক জায়গায় নেই। একটি হ্যাশম্যাপে, হ্যাশ মানটির পরিবর্তন হওয়া উচিত ছিল (এবং হওয়া উচিত) সুতরাং এটি সঠিক প্রবেশিকায় আর থাকবে না। ট্রিম্যাপে, গাছটি এখন নষ্ট হয়েছে কারণ নোডগুলির মধ্যে একটি ভুল দিকে রয়েছে।
যেহেতু এই কীগুলির জন্য একটি স্ট্রিং ব্যবহার এত সাধারণ, স্ট্রিংটিকে চূড়ান্ত করে এই আচরণটি প্রতিরোধ করা উচিত।
আপনার পড়তে আগ্রহী হতে পারে স্ট্রিং জাভাতে অপরিবর্তনীয় কেন? স্ট্রিংসের অপরিবর্তনীয় প্রকৃতি সম্পর্কে আরও তথ্যের জন্য।
ঘৃণ্য স্ট্রিং
স্ট্রিংয়ের জন্য বিভিন্ন ধরণের নিন্দিত বিকল্প রয়েছে। বিবেচনা করুন যে আমি যদি এমন একটি স্ট্রিং তৈরি করি যা সমান বলা হয় তখন সর্বদা সত্য হয় ... এবং এটি পাসওয়ার্ড চেকের মধ্যে দিয়ে গেছে? বা এটি তৈরি করেছে যাতে মাই স্ট্রিংয়ের অ্যাসাইনমেন্টগুলি স্ট্রিংয়ের একটি অনুলিপি কিছু ইমেল ঠিকানায় প্রেরণ করবে?
আপনার স্ট্রিং সাবক্লাস করার ক্ষমতা থাকলে এগুলি খুব বাস্তব সম্ভাবনা।
জাভা.লাং স্ট্রিং অপ্টিমাইজেশন
যদিও আমি আগেই উল্লেখ করেছি যে ফাইনাল স্ট্রিং দ্রুত করে না। তবে স্ট্রিং ক্লাস (এবং অন্যান্য ক্লাসেjava.lang
) ক্ষেত্র এবং পদ্ধতিগুলির প্যাকেজ স্তর সুরক্ষার ঘন ঘন ব্যবহার java.lang
করে স্ট্রিংয়ের সার্বক্ষণিক পাবলিক এপিআইয়ের পরিবর্তে অন্যান্য শ্রেণিগুলিকে ইন্টার্নালের সাথে টিঙ্কার করতে সক্ষম করে। মতো কাজগুলির getChars পরিসীমা পরীক্ষণ বা ছাড়া lastIndexOf যে StringBuffer দ্বারা ব্যবহৃত হয়, অথবা কন্সট্রাকটর যে শেয়ারের অন্তর্নিহিত অ্যারে (নোট যে না না একটি জাভা 6 জিনিস যে মেমরি সমস্যার কারণে পরিবর্তন করা হয়েছে)।
যদি কেউ স্ট্রিংয়ের একটি সাবক্লাস তৈরি করে থাকে তবে এটি সেই অপ্টিমাইজেশানগুলি ভাগ করতে সক্ষম হবে না (যদি না এটি খুব অংশ না হয় তবে এটি java.lang
একটি সিলড প্যাকেজ) )।
এক্সটেনশনের জন্য কোনও ডিজাইন করা শক্ত
কিছু ডিজাইনিং extendable হতে হয় কঠিন । এর অর্থ হল যে আপনি অন্য কোনও কিছু সংশোধন করতে সক্ষম হওয়ার জন্য আপনার অভ্যন্তরের অংশগুলি প্রকাশ করতে পেরেছেন।
একটি প্রসারিত স্ট্রিংয়ের স্মৃতি ফাঁস হতে পারে না । এর সেই অংশগুলিকে সাবক্লাসে প্রকাশ করা উচিত ছিল এবং কোডটি পরিবর্তনের অর্থ সাবক্লাসগুলি ভেঙে যাবে।
জাভা পিছনের সামঞ্জস্যের মধ্যে নিজেকে গর্বিত করে এবং বর্ধনের মূল ক্লাসগুলি খোলার মাধ্যমে তৃতীয় পক্ষের সাবক্লাসগুলির সাথে সামঞ্জস্যতা বজায় রাখার সময় কেউ কিছু ঠিক করার ক্ষমতা হারিয়ে ফেলে।
চেকস্টাইলের একটি বিধি রয়েছে যা এটি প্রয়োগ করে (অভ্যন্তরীণ কোড লেখার সময় আমাকে সত্যই হতাশ করে) "ডিজাইনফোর্ডএক্সটেনশন" নামে পরিচিত যা প্রতিটি শ্রেণি হয় তা প্রয়োগ করে:
- বিমূর্ত
- চূড়ান্ত
- খালি বাস্তবায়ন
এর জন্য যুক্তিযুক্ত:
এই এপিআই ডিজাইন শৈলীটি সাবক্লাসগুলি দ্বারা ভেঙে যাওয়ার বিরুদ্ধে সুপারক্লাসগুলিকে সুরক্ষা দেয়। খারাপ দিকটি হ'ল সাবক্লাসগুলি তাদের নমনীয়তার মধ্যে সীমাবদ্ধ, বিশেষত তারা সুপারক্লাসে কোড প্রয়োগ কার্যকর করতে বাধা দিতে পারে না, তবে এর অর্থ এইও হয় যে সাবক্লাসগুলি সুপার পদ্ধতিতে কল করতে ভুলে সুপারক্লাসের অবস্থাকে দূষিত করতে পারে না।
বাস্তবায়ন ক্লাসগুলি বাড়ানোর অনুমতি দেওয়ার অর্থ এই যে সাবক্লাসগুলি সম্ভবত এটির ভিত্তিতে অবস্থিত শ্রেণীর অবস্থাটিকে দূষিত করতে পারে এবং এটি তৈরি করতে পারে যাতে সুপারক্লাসের দেওয়া বিভিন্ন গ্যারান্টি অবৈধ। স্ট্রিং হিসাবে হিসাবে জটিল কিছু জন্য, এটি প্রায় একটি নিশ্চয়তা এটি পরিবর্তন অংশ হবে কিছু বিরতি।
বিকাশকারী হারবিস
এটি ডেভেলপার হওয়ার অংশ। সম্ভাবনা প্রতিটি ডেভেলপার তাদের নিজস্ব সংগ্রহ দিয়ে তাদের নিজস্ব স্ট্রিং উপশ্রেণী তৈরি করবে বিবেচনা utils এতে। তবে এখন এই সাবক্লাসগুলি নির্দ্বিধায় একে অপরের কাছে নির্ধারিত হতে পারে না।
WleaoString foo = new WleaoString("foo");
MichaelTString bar = foo; // This doesn't work.
এই পথ পাগলামি বাড়ে। সমস্ত জায়গাতে স্ট্রিংয়ে কাস্টিং করা এবং স্ট্রিংটি আপনার স্ট্রিং ক্লাসের উদাহরণ কিনা তা পরীক্ষা করে দেখুন, তার উপর ভিত্তি করে একটি নতুন স্ট্রিং তৈরি করেছেন এবং ... ঠিক, না। না।
আমি নিশ্চিত আপনি একটি ভাল স্ট্রিং বর্গ লিখতে পারেন আছি ... কিন্তু ঐ পাগল যারা সি লিখতে ++ এবং সঙ্গে মোকাবেলা করতে হবে একাধিক স্ট্রিং বাস্তবায়নের লেখা ছেড়ে std::string
এবং char*
এবং বুস্ট এবং কিছু SString , এবং বাকি সব ।
জাভা স্ট্রিং ম্যাজিক
স্ট্রিংসের সাথে জাভা কিছু জাদুকর জিনিস করে। এগুলি কোনও প্রোগ্রামারকে ভাষায় কিছু অসঙ্গতিগুলির সাথে মোকাবিলা করা সহজতর করে তোলে। স্ট্রিংয়ের উপর সাবক্লাসগুলি মঞ্জুরি দেওয়া কীভাবে এই magন্দ্রজালিক জিনিসগুলি মোকাবেলা করতে হবে সে সম্পর্কে কিছুটা গুরুত্বপূর্ণ চিন্তাভাবনা গ্রহণ করবে:
স্ট্রিং লিটারালস (জেএলএস 3.10.5 )
এমন একটি কোড রয়েছে যা একজনকে এটি করার অনুমতি দেয়:
String foo = "foo";
এটি পূর্ণসংখ্যার মতো সংখ্যার ধরণের বক্সিংয়ের সাথে বিভ্রান্ত হওয়ার দরকার নেই। আপনি করতে পারবেন না 1.toString()
, তবে আপনি করতে পারেন "foo".concat(bar)
।
+
অপারেটর (JLS 15.18.1 )
জাভাতে অন্য কোনও রেফারেন্স টাইপ এতে কোনও অপারেটর ব্যবহার করার অনুমতি দেয় না। স্ট্রিং বিশেষ। স্ট্রিং কনটেনটেশন অপারেটর এছাড়াও সংকলক স্তরে কাজ করে যাতে রানটাইম পরিবর্তে সংকলিত "foo" + "bar"
হয়ে "foobar"
গেলে তা হয়ে যায় ।
স্ট্রিং রূপান্তর (জেএলএস 5.1.11 )
সমস্ত স্ট্রিংকে কেবল স্ট্রিং প্রসঙ্গে ব্যবহার করে স্ট্রিংগুলিতে রূপান্তর করা যায়।
স্ট্রিং ইন্টার্নিং ( জাভাডক )
স্ট্রিং ক্লাসটির স্ট্রিংগুলির পুলে অ্যাক্সেস রয়েছে যা এটি স্ট্রিংয়ের অক্ষরে অক্ষরের সাথে সংকলনের ধরণে অবজেক্টের ক্যানোনিকাল উপস্থাপনা করতে দেয়।
স্ট্রিংয়ের একটি সাবক্লাসের অনুমতি দেওয়ার অর্থ হ'ল স্ট্রিং সহ এই বিটগুলি যা প্রোগ্রামিংকে সহজ করে তোলে যখন অন্যান্য স্ট্রিং প্রকারগুলি সম্ভব হয় তখন তা করা খুব কঠিন বা অসম্ভব হয়ে যায়।