স্ট্রিং ক্লাস জাভাতে চূড়ান্ত ঘোষণা করা হয় কেন?


141

যখন থেকে আমি জানতে পারলাম যে ক্লাসটি java.lang.Stringজাভাতে চূড়ান্ত হিসাবে ঘোষিত হয়েছে তখন আমি ভাবছিলাম কেন এটি। আমি তখন আর কোনও উত্তর পাইনি, তবে এই পোস্টটি: জাভাতে স্ট্রিং ক্লাসের একটি প্রতিলিপি কীভাবে তৈরি করব? আমার জিজ্ঞাসা সম্পর্কে মনে করিয়ে দিলেন।

অবশ্যই, স্ট্রিং আমার প্রয়োজন মতো সমস্ত কার্যকারিতা সরবরাহ করে এবং আমি কখনও এমন কোনও ক্রিয়াকলাপের কথা চিন্তা করি নি যার জন্য স্ট্রিং ক্লাসের সম্প্রসারণের প্রয়োজন হবে, তবে তবুও আপনি কখনই জানতে পারবেন না কারও কী প্রয়োজন হতে পারে!

সুতরাং, ডিজাইনাররা যখন এটি চূড়ান্ত করার সিদ্ধান্ত নিয়েছিল তখন কি কেউ জানতে পারে?


আপনার উত্তরগুলির জন্য আপনাকে ধন্যবাদ, বিশেষত ট্রুয়েল, ব্রুনো রিস এবং থিলো! আমি আশা করি আমি সেরা হিসাবে একাধিক উত্তর চয়ন করতে পারি, তবে দুর্ভাগ্যক্রমে ...!
অ্যালেক্স নটোসিয়াস

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

এই জবাবের জন্য এটি খুব দরকারী বলে ধন্যবাদ। আমাদের এখন দুটি তথ্য আছে। একটি স্ট্রিং একটি চূড়ান্ত শ্রেণি এবং এটি অপরিবর্তনীয় কারণ এটি পরিবর্তন করা যায় না তবে অন্য কোনও বস্তুর কাছে উল্লেখ করা যেতে পারে। তবে কী সম্পর্কে: - স্ট্রিং এ = নতুন স্ট্রিং ("টেস্ট 1"); তারপরে, s = "test2"; স্ট্রিং যদি ফাইনাল ক্লাস অবজেক্ট হয় তবে কীভাবে এটিকে সংশোধন করা যায়? আমি কীভাবে পরিবর্তিত চূড়ান্ত অবজেক্টটি ব্যবহার করতে পারি। আমি যদি ভুলভাবে কিছু জিজ্ঞাসা করি তবে দয়া করে আমাকে দিন।
সুরেশ শর্মা

আপনি এই ভাল নিবন্ধ দেখতে পারেন ।
অনিকেত ঠাকুর

4
জাভাতে আমরা একটি জিনিস কৃতজ্ঞতার সাথে এড়াতে পেরেছি তা হ'ল "প্রত্যেকের কাছে স্ট্রিংয়ের নিজস্ব উপক্লাস রয়েছে প্রচুর অতিরিক্ত পদ্ধতির সাথে এবং এগুলির কোনওটি একে অপরের সাথে সামঞ্জস্যপূর্ণ নয়"।
থরবজর্ন রাভন অ্যান্ডারসন

উত্তর:


88

স্ট্রিংগুলি অপরিবর্তনীয় বস্তু হিসাবে প্রয়োগ করা খুব দরকারী । এ সম্পর্কে আরও বোঝার জন্য আপনার অপরিবর্তনীয়তা সম্পর্কে পড়া উচিত ।

অপরিবর্তনীয় বস্তুর একটি সুবিধা হ'ল

আপনি একক দৃষ্টান্তে নকলগুলি ভাগ করে নিতে পারেন।

(থেকে এখানে )।

স্ট্রিং যদি চূড়ান্ত না হয় তবে আপনি একটি সাবক্লাস তৈরি করতে এবং দুটি স্ট্রিং থাকতে পারে যা "স্ট্রিংস হিসাবে দেখা যায়" যখন একই রকম দেখায় তবে তা আসলে আলাদা।


70
চূড়ান্ত ক্লাস এবং অপরিবর্তনীয় বস্তুর মধ্যে যে সংযোগটি আমি দেখছি না তার মধ্যে যদি না হয়, আমি দেখতে পাই না যে আপনার উত্তর কীভাবে প্রশ্নের সাথে সম্পর্কিত।
sepp2k 1

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

4
কি দারুন! Downvotes? সাবক্লাসিং কীভাবে অপরিবর্তনীয়তার সাথে সম্পর্কিত বলে আপনি বুঝতে পারছেন না? আমি সমস্যা কি তার একটি ব্যাখ্যা প্রশংসা করব।
ব্রুনো রিস

7
@ ব্রুনো, পুন: ডাউনভোটস: আমি আপনাকে হ্রাস করি নি, তবে আপনি কীভাবে সাবক্লাসগুলি প্রতিরোধের মাধ্যমে অপরিবর্তনীয়তা প্রয়োগ করে তা সম্পর্কে একটি বাক্য যুক্ত করতে পারেন। এই মুহুর্তে, এটি একধরনের উত্তর।
থিলো

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

60

এটি একটি সুন্দর নিবন্ধ যা উপরের উত্তরগুলিতে ইতিমধ্যে উল্লিখিত দুটি কারণের রূপরেখা দেয়:

  1. সুরক্ষা : সিস্টেমগুলি কেবলমাত্র পঠনযোগ্য তথ্যের সংবেদনশীল বিটগুলি তাদের পরিবর্তন করা হবে তা ভেবে উদ্রেক করতে পারে
  2. পারফরম্যান্স : অপরিবর্তনীয় ডেটা জিনিসগুলিকে থ্রেড-সেফ তৈরিতে খুব দরকারী।

এবং এটি সম্ভবত এই নিবন্ধে সর্বাধিক বিস্তারিত মন্তব্য। এটি জাভা এবং সুরক্ষা সংক্রান্ত সমস্যার স্ট্রিং পুলের সাথে সম্পর্কিত 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>এবং আপনার যে পুলটিতে প্রবেশ করতে হবে তা হ'ল একটি নতুন শ্রেণির লোকে।


2
অবশ্যই পারফরম্যান্সের কারণটি একটি ত্রুটিযুক্ত: স্ট্রিংয়ের একটি ইন্টারফেস হয়ে থাকলে আমি আমার প্রয়োগে আরও ভাল পারফরম্যান্স করে এমন একটি বাস্তবায়ন সরবরাহ করতে সক্ষম হত।
স্টিফান এগারমন্ট

28

স্ট্রিং অপরিবর্তনীয় বা চূড়ান্ত যে একেবারে গুরুত্বপূর্ণ কারণ এটি শ্রেণি লোডিং পদ্ধতি ব্যবহার করে এবং এর ফলে গভীর এবং মৌলিক সুরক্ষা দিক রয়েছে aspects

স্ট্রিংটি পরিবর্তনযোগ্য বা চূড়ান্ত না হলে "java.io.Writer" লোড করার জন্য একটি অনুরোধ "মিল.ভোগুন.ডিস্ক ইরেজিং রাইটার" লোড করা যেতে পারে

রেফারেন্স: স্ট্রিং জাভাতে অপরিবর্তনীয় কেন


15

String জাভা একটি খুব মূল বর্গ, অনেক কিছুই একটি নির্দিষ্ট উপায়ে কাজ করে এটি উপর নির্ভর করে, উদাহরণস্বরূপ অপরিবর্তনীয়।

শ্রেণি তৈরি করা finalএই অনুমানগুলি ভেঙে ফেলতে পারে এমন সাবক্লাসগুলি বাধা দেয়।

মনে রাখবেন, এখন পর্যন্ত, আপনি যদি প্রতিবিম্ব ব্যবহার করেন তবে আপনি স্ট্রিংগুলি ভেঙে ফেলতে পারেন (তাদের মান বা হ্যাশকোড পরিবর্তন করুন)। সুরক্ষা ব্যবস্থাপকের সাথে প্রতিবিম্ব বন্ধ করা যেতে পারে। তাহলে Stringছিল না final, সবাই এটা করতে পারে।

ঘোষিত না হওয়া অন্যান্য ক্লাসগুলি finalআপনাকে কিছুটা ভাঙা সাবক্লাসগুলি সংজ্ঞায়িত করার অনুমতি দেয় ( Listউদাহরণস্বরূপ, আপনার এমন একটি হতে পারে যা ভুল অবস্থানে যোগ করতে পারে ) তবে কমপক্ষে জেভিএম তার মূল কাজগুলির জন্য নির্ভর করে না।


6
finalএকটি ক্লাসে অপরিবর্তনীয়তা গ্যারান্টি দেয় না। এটি কেবল গ্যারান্টি দেয় যে কোনও শ্রেণির আক্রমণকারী (যার মধ্যে একটি অপরিবর্তনীয় হতে পারে) একটি উপ-শ্রেণীর দ্বারা পরিবর্তন করা যায় না।
কেভিন ব্রক

1
@ কেভিন: হ্যাঁ একটি ক্লাসে ফাইনাল গ্যারান্টি দেয় যে কোনও সাবক্ল্যাস নেই। অপরিবর্তনীয়তার সাথে কিছুই করার নেই।
থিলো

4
ক্লাস ফাইনাল করা নিজেরাই এটিকে অচল করে দেয় না। তবে একটি অপরিবর্তনীয় শ্রেণির চূড়ান্ত তৈরির বিষয়টি নিশ্চিত করে যে কেউই এমন উপশ্রেন তৈরি করে না যা অপরিবর্তনীয়তা ভঙ্গ করে। সম্ভবত অপরিবর্তনীয়তা সম্পর্কে যে বক্তব্য তৈরি করা হয়েছে তারা ঠিক কী বোঝাতে চেয়েছিলেন তা অস্পষ্ট ছিল, তবে তাদের বক্তব্য প্রসঙ্গে বোঝা গেলে সঠিক হয় understood
জে

কিছুক্ষণ আগে আমি এই উত্তরটি পড়েছিলাম এবং আমি ভেবেছিলাম এটি একটি ওকে উত্তর, তারপরে আমি হ্যাশকোড পড়ি এবং 'কার্যকর জাভা' থেকে সমান এবং বুঝতে পারি যে এটি খুব ভাল উত্তর। যে কারওও ব্যাখ্যা দরকার, আমি একই বইয়ের 8am এবং পুনরায় 9 বাজেটের প্রস্তাব দিই।
অভিষেক সিং

6

যেমন ব্রুনো বলেছিল এটি অপরিবর্তনীয়তা সম্পর্কে। এটি কেবল স্ট্রিংস সম্পর্কেই নয় তবে যেকোন মোড়কের সম্পর্কে যেমন ডাবল, পূর্ণসংখ্যা, চরিত্র ইত্যাদি There এর অনেকগুলি কারণ রয়েছে:

  • থ্রেড সুরক্ষা
  • নিরাপত্তা
  • নিজেই জাভা দ্বারা পরিচালিত হিপগুলি (সাধারণ স্তূপের থেকে পৃথকভাবে যা বিভিন্নভাবে আবর্জনা সংগ্রহ করা হয়)
  • স্মৃতি ব্যবস্থাপনা

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

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

আছে HTH

তথ্যসূত্র:


1
আমি বিশ্বাস করি না যে স্ট্রিংসগুলি একটি অন্যরূপ স্তূপে যায় বা একটি ভিন্ন মেমরি পরিচালনা ব্যবহার করে। তারা অবশ্যই আবর্জনা সংগ্রহযোগ্য।
থিলো

2
এছাড়াও, কোনও শ্রেণীর চূড়ান্ত কীওয়ার্ড কোনও ক্ষেত্রের চূড়ান্ত কীওয়ার্ডের চেয়ে সম্পূর্ণ আলাদা।
থিলো

1
ঠিক আছে, সান এর জেভিএম-এ, স্ট্রিংগুলি যা ইন্টার্ন () এড হয় সেগুলি পারম-জেনের মধ্যে যেতে পারে, যা গাদা অংশ নয়। তবে এটি অবশ্যই সমস্ত স্ট্রিং বা সমস্ত জেভিএম-এর জন্য ঘটে না।
থিলো

2
সমস্ত স্ট্রিংস সেই অঞ্চলে যায় না, কেবল স্ট্রিংগুলি ইন্টার্ন করা হয়েছিল। আক্ষরিক স্ট্রিংগুলির জন্য ইন্টার্নিং স্বয়ংক্রিয়। (@ থিলো, আপনি আপনার মন্তব্য জমা দেওয়ার সাথে সাথে টাইপ করছেন)।
কেভিন ব্রক

এই জবাবের জন্য এটি খুব দরকারী বলে ধন্যবাদ। আমাদের এখন দুটি তথ্য আছে। একটি স্ট্রিং একটি চূড়ান্ত শ্রেণি এবং এটি অপরিবর্তনীয় কারণ এটি পরিবর্তন করা যায় না তবে অন্য কোনও বস্তুর কাছে উল্লেখ করা যেতে পারে। তবে কী সম্পর্কে: - স্ট্রিং এ = নতুন স্ট্রিং ("টেস্ট 1"); তারপরে, s = "test2"; স্ট্রিং যদি ফাইনাল ক্লাস অবজেক্ট হয় তবে কীভাবে এটিকে সংশোধন করা যায়? আমি কীভাবে পরিবর্তিত চূড়ান্ত অবজেক্টটি ব্যবহার করতে পারি। আমি যদি ভুলভাবে কিছু জিজ্ঞাসা করি তবে দয়া করে আমাকে দিন।
সুরেশ শর্মা

2

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


3
"উত্তরাধিকারের জন্য নকশা করা শক্ত" এর জন্য +1। বিটিডাব্লু, এটি ব্লচের "কার্যকর জাভা" তে খুব সুন্দরভাবে ব্যাখ্যা করা হয়েছে।
1010

2

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

সংক্ষেপে বলা যায় যে স্ট্রিং অপরিবর্তনীয়, কেউ একবার তৈরি হয়ে গেলে এর সামগ্রীগুলি পরিবর্তন করতে পারে না যা স্ট্রিংয়ের হ্যাশকোডকে একাধিক অনুরোধে একই হওয়ার গ্যারান্টি দেয়।

আপনি যদি দেখেন Stringশ্রেণি হিসাবে ঘোষণা করা হয়েছে

/** Cache the hash code for the string */
private int hash; // Default to 0

এবং hashcode()ফাংশনটি নিম্নরূপ -

public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}

যদি এটি ইতিমধ্যে কম্পিউটার হয় তবে মানটি ফিরিয়ে দিন।


2

আমরা আরও কার্যকর বাস্তবায়ন না পেয়েছি তা নিশ্চিত করার জন্য। এটি অবশ্যই একটি ইন্টারফেস করা উচিত ছিল।

আহ [সম্পাদনা] আরও নিখুঁত ভোট পেয়ে। উত্তর পুরোপুরি গুরুতর। আমাকে বোকা স্ট্রিং বাস্তবায়নের প্রায় বেশ কয়েকবার প্রোগ্রাম করতে হয়েছিল, ফলে গুরুতর কর্মক্ষমতা এবং উত্পাদনশীলতা হ্রাস পায়


2

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


2

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

class MyComplex extends String { ... }

MyComplex a = new MyComplex("5+3i");
MyComplex b = new MyComplex("7+4i");
MyComplex c = new MyComplex(a + b);   // would work since a and b are strings,
                                      // and a string + a string is a string.

1

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


1
আমার মতে স্ট্রিং কখনই আদিম ধরণের মতো আচরণ করে না। "জাভা" এর মতো একটি স্ট্রিং আক্ষরিক আসলে স্ট্রিং ক্লাসের একটি অবজেক্ট (আপনি অবিলম্বে সমাপনী উদ্ধৃতি অনুসরণ করে এর উপরে ডট অপারেটরটি ব্যবহার করতে পারেন)। সুতরাং একটি স্ট্রিং ভেরিয়েবলকে আক্ষরিক অর্পণ করা ঠিক যথারীতি অবজেক্ট রেফারেন্স নির্ধারণ করা। ভিন্নটি হ'ল স্ট্রিং ক্লাসটির ভাষা-স্তরের সমর্থন রয়েছে সংকলকটিতে ... স্ট্রিং অবজেক্টগুলিতে ডাবল উদ্ধৃতিতে জিনিস এবং + অপারেটর উপরে উল্লিখিত হিসাবে।
জর্জি

1

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


1

ধরা যাক আপনার একটি Employeeক্লাস রয়েছে যার একটি পদ্ধতি রয়েছে greetgreetপদ্ধতিটি যখন এটিকে বলা হয় কেবল মুদ্রণ করে Hello everyone!। সুতরাং যে হয় প্রত্যাশিত আচরণ এর greetপদ্ধতি

public class Employee {

    void greet() {
        System.out.println("Hello everyone!");
    }
}

এখন, নীচের মত GrumpyEmployeeসাবক্লাস Employeeএবং ওভাররাইড greetপদ্ধতিটি যাক ।

public class GrumpyEmployee extends Employee {

    @Override
    void greet() {
        System.out.println("Get lost!");
    }
}

এখন নীচের sayHelloকোডটিতে পদ্ধতিটি দেখুন। এটি Employeeপ্যারামিটার হিসাবে উদাহরণস্বরূপ লাগে এবং অভিবাদন পদ্ধতিটিকে কল করে এটি আশা করে যে এটি বলবে Hello everyone!তবে আমরা যা পাই তা তা Get lost!। আচরণে এই পরিবর্তন কারণEmployee grumpyEmployee = new GrumpyEmployee();

public class TestFinal {
    static Employee grumpyEmployee = new GrumpyEmployee();

    public static void main(String[] args) {
        TestFinal testFinal = new TestFinal();
        testFinal.sayHello(grumpyEmployee);
    }

    private void sayHello(Employee employee) {
        employee.greet(); //Here you would expect a warm greeting, but what you get is "Get lost!"
    }
}

শ্রেণি তৈরি করা গেলে এই পরিস্থিতি এড়ানো যায় । ক্লাস হিসাবে ঘোষণা না করা হলে একটি চিত্তাকর্ষণকারী প্রোগ্রামার যে পরিমাণ বিশৃঙ্খলা সৃষ্টি করতে পারে এটি এখন আপনার কল্পনার উপরে ।EmployeefinalStringfinal


0

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


0

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

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

newtype AccountCode = AccountCode Text
newtype FundCode = FundCode Text

তাই আমি জাভা ভাষার উন্নতি হিসাবে নিম্নলিখিত পরামর্শটি সামনে রেখে যাব:

newtype AccountCode of String;
newtype FundCode of String;

AccountCode acctCode = "099876";
FundCode fundCode = "099876";

acctCode.equals(fundCode);  // evaluates to false;
acctCode.toString().equals(fundCode.toString());  // evaluates to true;

acctCode=fundCode;  // compile error
getAccount(fundCode);  // compile error

(অথবা সম্ভবত আমরা জাভা থেকে নিজেকে ছাঁটাই শুরু করতে পারে)


-1

আপনি যদি একবার স্ট্রিং তৈরি করেন তবে এটি বিবেচনা করবে, এটি এমন একটি বিষয় যা আপনি এটি পরিবর্তন করতে চান এটি সম্ভব নয়, এটি নতুন অবজেক্ট তৈরি করবে।


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