জাভা.লং.স্ট্রিং চূড়ান্ত না হলে কী হবে?


16

আমি দীর্ঘ সময় জাভা বিকাশকারী এবং অবশেষে, বড় হওয়ার পরে, শংসাপত্র পরীক্ষা দেওয়ার জন্য আমার এটাকে শালীনভাবে অধ্যয়ন করার সময় আছে ... একটি জিনিস যা আমাকে সর্বদা বিরক্ত করে তা হ'ল স্ট্রিং "ফাইনাল"। আমি যখন সুরক্ষা সংক্রান্ত সমস্যা এবং সম্পর্কিত স্টাফগুলি সম্পর্কে একটি পঠন পাঠ করেছি তখন তা আমি বুঝতে পারি ... তবে, গুরুত্বের সাথে, কারও কি এর সত্য উদাহরণ রয়েছে?

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


9
আপনি এই প্রশ্নে স্ট্যাক ওভারফ্লোতে আগ্রহী হতে পারেন: স্ট্যাকওভারফ্লো
টমাস ওয়ানস

একইভাবে, java.io.Fileনা হলে কী হবে final। ওহ, এটা না। দাত্ত।
টম হাটিন -

1
আমরা জানি এটি পশ্চিমা সভ্যতার সমাপ্তি।
তুলিনাস কর্ডোভা

উত্তর:


22

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

আর একটি কারণ থ্রেড সুরক্ষা: অপরিবর্তনীয় সর্বদা থ্রেড সুরক্ষিত কারণ কোনও থ্রেড অন্য কারও কাছে যাওয়ার আগে তাদের পুরোপুরি তৈরি করতে হয় - এবং বিল্ডিংয়ের পরে সেগুলি আর পরিবর্তন করা যায় না।

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


2
এটি একটি ভুল উত্তর। জেভিএম স্পেক দ্বারা প্রয়োজনীয় যাচাইকরণ ব্যতীত হটস্পট কেবলমাত্র finalতাড়াতাড়ি চেক হিসাবে ব্যবহার করে যে কোডটি সংকলন করার সময় কোনও পদ্ধতি ওভাররাইড হয় না।
টম হাটিন - ২

1
@ টমহটিন-ট্যাকলাইন: তথ্যসূত্র?
অ্যারন দিগুল্লা

1
আপনি বোঝাচ্ছেন যে অপরিবর্তনীয়তা এবং চূড়ান্ত হওয়া কোনওভাবেই সম্পর্কিত। "আর একটি কারণ থ্রেড সুরক্ষা: অপরিবর্তনীয় সর্বদা থ্রেড নিরাপদ খ ..."। কোনও বস্তু অপরিবর্তনীয় বা না হওয়ার কারণ সেগুলি চূড়ান্ত বা না হওয়ার কারণ নয়।
তুলাইনস কর্ডোভা

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

1
@ স্নোম্যান সুনির্দিষ্টভাবে বলতে গেলে, অ্যারের চূড়ান্ত হওয়া অক্ষরটি কেবল অ্যারের রেফারেন্সকে অপরিবর্তনীয় করে তোলে, অ্যারের সামগ্রীগুলি নয়।
মিশা কোসমুলস্কি

10

জাভার Stringক্লাস চূড়ান্ত হওয়ার আরও একটি কারণ আছে : কিছু পরিস্থিতিতে সুরক্ষার জন্য এটি গুরুত্বপূর্ণ। যদি Stringশ্রেণিটি চূড়ান্ত না হয় তবে নিম্নলিখিত কোডটি দূষিত কলারের দ্বারা সূক্ষ্ম আক্রমণে ঝুঁকির মধ্যে পড়ে:

 public String makeSafeLink(String url, String text) {
     if (!url.startsWith("http:") && !url.startsWith("https:"))
         throw SecurityException("only http/https URLs are allowed");
     return "<a href=\"" + escape(url) + "\">" + escape(text) + "</a>";
 }

আক্রমণ: একটি দূষিত কলকারী স্ট্রিংয়ের একটি সাবক্লাস তৈরি করতে পারে EvilString, যেখানে EvilString.startsWith()সর্বদা সত্য ফিরে আসে তবে যেখানে এর মান EvilStringকিছু খারাপ (যেমন, javascript:alert('xss'))। সাবক্লাসিংয়ের কারণে এটি সুরক্ষা চেক এড়াতে পারে। এই আক্রমণটি চেক-টু-টাইম-অফ-ব্যবহার (ট্যাকটিউইউ) দুর্বলতা হিসাবে পরিচিত: চেকটি করার সময় (যে ইউআরএলটি http / https দিয়ে শুরু হয়) এবং মানটি ব্যবহৃত হয় সেই সময়ের মধ্যে (এইচটিএমএল স্নিপেট তৈরি করতে), কার্যকর মান পরিবর্তন করতে পারে। যদি Stringএটি চূড়ান্ত না হয় তবে টেকটিউ ঝুঁকিগুলি বিস্তৃত হবে।

সুতরাং যদি Stringতা চূড়ান্ত না হয়, আপনি যদি নিজের কলারের উপর বিশ্বাস না রাখতে পারেন তবে সুরক্ষিত কোডটি লেখা মুশকিল হয়ে যায়। অবশ্যই জাভা লাইব্রেরিগুলিতে ঠিক সেই অবস্থানটি রয়েছে: তারা অবিশ্বস্ত অ্যাপলেট দ্বারা ডাকা হতে পারে, তাই তারা তাদের আহ্বানকারীকে বিশ্বাস করার সাহস পায় না। এর অর্থ হ'ল Stringচূড়ান্ত না হলে সুরক্ষিত লাইব্রেরি কোডটি লেখা অযৌক্তিকভাবে জটিল trick


অবশ্যই, char[]স্ট্রিংয়ের অভ্যন্তরের অভ্যন্তরীণ পরিবর্তনটি প্রতিবিম্বের সাহায্যে সেই ট্যাকটিউ টিউনটি টানানো এখনও সম্ভব , তবে এটির সময়টিতে কিছু ভাগ্যের প্রয়োজন।
পিটার টেলর

2
@ পিটার টেইলর, এটি এর চেয়ে জটিল। সিকিউরিটি ম্যানেজার আপনাকে এটি করার অনুমতি দিলে আপনি কেবলমাত্র ব্যক্তিগত ভেরিয়েবলগুলি অ্যাক্সেস করতে প্রতিবিম্বটি ব্যবহার করতে পারেন। অ্যাপলেট এবং অন্যান্য অবিশ্বস্ত কোডকে এই অনুমতি দেওয়া হয় না এবং এভাবে char[]স্ট্রিংয়ের অভ্যন্তরে প্রাইভেট সংশোধন করতে প্রতিবিম্ব ব্যবহার করতে পারে না ; অতএব, তারা টেকটিউ দুর্বলতা কাজে লাগাতে পারে না।
ডিডাব্লু

আমি জানি, তবে এটি এখনও অ্যাপ্লিকেশনগুলি এবং স্বাক্ষরিত অ্যাপলেটগুলি ছেড়ে দেয় - এবং স্ব-স্বাক্ষরিত অ্যাপলেটটির জন্য সতর্কতা সংলাপ দ্বারা আসলে কত লোক ভয় পেয়ে যায়?
পিটার টেলর

2
@ পিটার, এটি বিন্দু নয়। মুল বক্তব্যটি হ'ল বিশ্বস্ত জাভা লাইব্রেরিগুলি লেখার কাজটি আরও অনেক কঠিন হতে পারে এবং জাভা লাইব্রেরিতে Stringচূড়ান্ত না হলে আরও অনেক বেশি দুর্বলতার কথা বলা হত। যতক্ষণ সময় এই হুমকির মডেলটি প্রাসঙ্গিক হয় ততক্ষণ তার বিরুদ্ধে রক্ষা করা গুরুত্বপূর্ণ হয়ে ওঠে। যতক্ষণ এটি অ্যাপলেট এবং অন্যান্য অবিশ্বস্ত কোডের পক্ষে গুরুত্বপূর্ণ, ততক্ষণে Stringএটি চূড়ান্ত করার পক্ষে ন্যায্যতা যথেষ্ট , এমনকি এটি যদি বিশ্বস্ত অ্যাপ্লিকেশনগুলির জন্য প্রয়োজন না হয়। (যে কোনও ক্ষেত্রে, বিশ্বস্ত অ্যাপ্লিকেশনগুলি ইতিমধ্যে চূড়ান্ত কিনা তা বিবেচনা না করেই সমস্ত সুরক্ষা ব্যবস্থা বাইপাস করতে পারে
ডিডাব্লু

"আক্রমণ: একটি দূষিত কলকারী স্ট্রিং, এভিলস্ট্রিংয়ের একটি সাবক্লাস তৈরি করতে পারে, যেখানে এভিলস্ট্রিং.স্টার্টস () সর্বদা সত্য প্রত্যাবর্তন করে ..." - না যদি শুরু হয় () চূড়ান্ত হয়।
এরিক

4

যদি তা না হয় তবে মাল্টিথ্রেডেড জাভা অ্যাপ্লিকেশনগুলি একটি জগাখিচুড়ি হবে (আসলে যা আছে তার থেকেও খারাপ)।

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


3
finalক্লাসের পরিবর্তনের সাথে ক্লাসের কোনও সম্পর্ক নেই।

এই উত্তরটি প্রশ্নের সমাধান করে না। -1
FUZxxl

3
জারোদ রবারসন: শ্রেণিটি চূড়ান্ত না হলে আপনি উত্তরাধিকার ব্যবহার করে পরিবর্তনীয় স্ট্রিং তৈরি করতে পারেন।
ysdx

@ জারোদরবারসন অবশেষে কেউ ত্রুটিটি লক্ষ্য করেছেন। গৃহীত উত্তর চূড়ান্ত সমতুল্য অপরিবর্তনীয় বোঝায়।
তুলাইনস কর্ডোভা

1

Stringচূড়ান্ত হওয়ার আরেকটি সুবিধা হ'ল এটি অনিবার্যতার মতোই অনুমানযোগ্য ফলাফলও নিশ্চিত করে। Stringযদিও কোনও শ্রেণি, মানে কয়েকটি মানের হিসাবে চিকিত্সা করা উচিত, যেমন একটি মান ধরণের (সংকলক এমনকি এটির মাধ্যমে সমর্থন করে String blah = "test")। অতএব, আপনি যদি একটি নির্দিষ্ট মান দিয়ে স্ট্রিং তৈরি করেন, আপনি এটির প্রত্যাশার অনুরূপ যে কোনও স্ট্রিংয়ের উত্তরাধিকারসূত্রে নির্দিষ্ট আচরণ রয়েছে বলে আশা করেন।

এ সম্পর্কে চিন্তা করুন: আপনি যদি উপ-শ্রেণীর java.lang.Stringএবং পদ্ধতিগুলি equalsবা অতিরিক্ত-চালিত হন তবে hashCodeকী হবে? হঠাৎ দুটি স্ট্রিং "পরীক্ষা" আর একে অপরের সমান হতে পারে না।

আমি যদি এটি করতে পারি তবে বিশৃঙ্খলার কল্পনা করুন:

public class Password extends String {
    public Password(String text) {
        super(text);
    }

    public boolean equals(Object o) {
        return true;
    }
}

অন্য কিছু শ্রেণি:

public boolean isRightPassword(String suppliedString) {
    return suppliedString != null && suppliedString.equals("secret");
}

public void login(String username, String password) {
    return isRightUsername(username) && isRightPassword(password);
}

public void loginTest() {
    boolean success = login("testuser", new Password("wrongpassword"));
    // success is true, despite the password being wrong
}

1

পটভূমি

তিনটি জায়গা যেখানে জাভাতে ফাইনাল প্রদর্শিত হতে পারে:

  • ক্লাস (জেএলএস 8.1.1.2 )
  • পদ্ধতি (জেএলএস 8.4.3.3 )
  • ক্ষেত্রগুলি (জেএলএস 8.3.1.2 )

ক্লাস ফাইনাল করা ক্লাসের সমস্ত সাবক্লাসিং বাধা দেয়। কোনও পদ্ধতি চূড়ান্ত করা পদ্ধতিটির উপশ্রেণীটিকে ওভাররাইড করা থেকে বাধা দেয়। ফিল্ড ফাইনাল করা এটিকে পরে পরিবর্তিত হতে বাধা দেয়।

ভ্রান্ত ধারনা

চূড়ান্ত পদ্ধতি এবং ক্ষেত্রগুলিতে ঘটে এমন অপ্টিমাইজেশন রয়েছে।

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

একটি চূড়ান্ত পরিবর্তনশীল আক্রমণাত্মকভাবে অনুকূলিত করা যায় এবং এ সম্পর্কে আরও জেএলএস বিভাগে 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 )

    সমস্ত স্ট্রিংকে কেবল স্ট্রিং প্রসঙ্গে ব্যবহার করে স্ট্রিংগুলিতে রূপান্তর করা যায়।

  • স্ট্রিং ইন্টার্নিং ( জাভাডক )

    স্ট্রিং ক্লাসটির স্ট্রিংগুলির পুলে অ্যাক্সেস রয়েছে যা এটি স্ট্রিংয়ের অক্ষরে অক্ষরের সাথে সংকলনের ধরণে অবজেক্টের ক্যানোনিকাল উপস্থাপনা করতে দেয়।

স্ট্রিংয়ের একটি সাবক্লাসের অনুমতি দেওয়ার অর্থ হ'ল স্ট্রিং সহ এই বিটগুলি যা প্রোগ্রামিংকে সহজ করে তোলে যখন অন্যান্য স্ট্রিং প্রকারগুলি সম্ভব হয় তখন তা করা খুব কঠিন বা অসম্ভব হয়ে যায়।


0

স্ট্রিং যদি চূড়ান্ত না হয় তবে প্রতিটি প্রোগ্রামার সরঞ্জাম বুকের নিজস্ব "কেবল কয়েকটি দুর্দান্ত সহায়ক পদ্ধতি সহ স্ট্রিং" থাকবে would এগুলির প্রতিটি অন্যান্য সরঞ্জাম বুকের সাথে বেমানান হবে।

আমি এটিকে নির্বোধ বাধা হিসাবে বিবেচনা করেছি। আজ আমি নিশ্চিত হয়ে উঠলাম এটি একটি অত্যন্ত দৃ sound় সিদ্ধান্ত ছিল। এটি স্ট্রিংগুলি স্ট্রিংগুলিতে রাখে।


finalজাভাতে finalসি # তে একই জিনিস নয় । এই প্রসঙ্গে, এটি সি # এর হিসাবে একই জিনিস readonly। দেখুন stackoverflow.com/questions/1327544/...
আরসেনি Mourzenko

9
@ মাইনমা: প্রকৃতপক্ষে, এই প্রসঙ্গে মনে হচ্ছে এটি সি # এর সিলডের মতোই, যেমন রয়েছে public final class String
Configurator
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.