জাভাতে স্ট্রিং নেই কেন?


260

আমি বুঝতে পারি যে আমি যখনই স্ট্রিংকে আক্ষরিক টাইপ করি ""তখন স্ট্রিং পুলে একই স্ট্রিং অবজেক্টটি রেফারেন্স করা হয়।

তবে স্ট্রিং এপিআইতে কেন একটি অন্তর্ভুক্ত নেই public static final String Empty = "";তাই আমি উল্লেখগুলি ব্যবহার করতে String.Emptyপারি?

এটি কমপক্ষে সংক্ষেপে সময় সাশ্রয় করতে পারে, যেহেতু সংকলকটি বিদ্যমান স্ট্রিংটির রেফারেন্স জানত, এবং এটি পুনরায় ব্যবহারের জন্য ইতিমধ্যে তৈরি করা হয়েছে কিনা তা পরীক্ষা করতে হবে না, তাই না? এবং ব্যক্তিগতভাবে আমি মনে করি স্ট্রিং লিটারালগুলির বিস্তার, বিশেষত ক্ষুদ্রতর, বেশিরভাগ ক্ষেত্রে একটি "কোড গন্ধ"।

তাহলে স্ট্রিংয়ের পিছনে কোনও গ্র্যান্ড ডিজাইনের কারণ ছিল না? খালি, না কি ভাষা নির্মাতারা কেবল আমার মতামত ভাগ করে নিল?


5
আইডাঙ্ক: আমি মনে করি তিনি তার মতো পরিস্থিতি যেখানে আপনার পছন্দ মতো জিনিসগুলি পছন্দ করেন outputBlah = ""এবং তিনি সম্ভবত তার চেয়ে something == String.Emptyবেশি পছন্দ করেন something.Length > 0(আপনি নাল চেক এড়িয়ে যান))
স্কুরমেডেল

2
@ আইডাঙ্ক - তিনি সংগ্রহের মতো "ফাঁকা সদস্য" খুঁজছিলেন। এমপিটিওয়াই_এসইটি , "শূন্যতা" স্ট্রিং পরীক্ষা করার জন্য কোনও ফাংশন নয়।
টিম স্টোন

2
@ আইডাঙ্ক: এটি যা অনুপ্রাণিত করেছিল তা আসলে 'টেক্সটবক্স.সেটটেক্সট ("");'।
টম ট্রেসানস্কি

3
একটি String.isEmpty()ফাংশন আছে ... আপনি চান কেন String.EMPTY?
বুহাকে সিন্ধি

8
String.isEmpty()একটি খালি স্ট্রিং ফিরে না।
স্টিভ কুও

উত্তর:


191

String.EMPTY12 টি অক্ষর, এবং ""দুটি, এবং তারা দুজন রানটাইমের সময় স্মৃতিতে ঠিক একই উদাহরণটি উল্লেখ করবে। আমি সম্পূর্ণরূপে নিশ্চিত নই কেন String.EMPTYসংকলনের সময় বাঁচাতে হবে, আসলে আমি মনে করি এটিই পরে থাকবে।

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


আপনার মন্তব্য থেকে প্রশ্নটিতে আপডেট করুন:

এটি অনুপ্রেরণা আসলে কি TextBox.setText("");

আমি বিশ্বাস করি আপনার উপযুক্ত শ্রেণিতে ধ্রুবক সরবরাহ করা সম্পূর্ণ বৈধ হবে:

private static final String EMPTY_STRING = "";

এবং তারপরে আপনার কোড হিসাবে এটি উল্লেখ করুন

TextBox.setText(EMPTY_STRING);

এইভাবে অন্তত আপনি স্পষ্ট যে আপনি একটি খালি স্ট্রিং চান, বরং আপনি নিজের আইডিই বা এর অনুরূপ কিছুতে স্ট্রিং পূরণ করতে ভুলে গিয়েছেন।


14
আমি আপনাকে এখনও +1 করব, তবে আমি নোংরা বোধ করছি কারণ আপনি StringBuilderদশজনের মধ্যে নয় বার কীভাবে কনটেনটেশন না করে ব্যবহার করা একেবারেই অনুচিত তা সম্পর্কে কথা না বলেই উল্লেখ করেছেন StringBuilder
Randolpho

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

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

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


133

ব্যবহার org.apache.commons.lang.StringUtils.EMPTY


29
খালি "" এর চেয়ে অনেক সুন্দর এবং পড়া সহজ মনে হচ্ছে। আমি আশা করি এটি কেবল আমার নয়।
লাকাতোস গায়ুলা

2
@ লাকাতোসজিউলা - আমি মনে করি এটি হতে পারে (কেবল আপনি)। দক্ষ জাভা প্রোগ্রামারদের পড়তে কোনও সমস্যা নেই ""... এবং সম্ভবত বেশিরভাগEMPTY ক্ষেত্রে নির্দিষ্ট EMPTYডোমেইনের নির্দিষ্ট অর্থ ব্যতীত উচ্চারণে উচ্চারণ করতে হবে of (এবং এই জাতীয় ক্ষেত্রে সম্ভবত আরও উপযুক্ত নাম রয়েছে))
স্টিফেন সি

14
@ লাকাতোস জিউলা এটি কেবল আপনি নন। আমি জাভা থেকে। নেট বিকাশে গিয়েছিলাম এবং স্ট্রিং.এম্পটি এমন একটি বৈশিষ্ট্য ছিল যা আমি ফ্রেমওয়ার্কটিতে খুশি হয়েছিল। উদ্ধৃতিগুলির একটি খালি সেট-এর চেয়ে আমি এর স্পষ্ট প্রকৃতিটি পছন্দ করি।
যোহোহোহো

63
@ স্টেফেনসি যখন আমি একটি খালি "" প্রথম জিনিসটি মনে মনে লাফিয়ে দেখি যে এটি একটি বাগ, কেউ ফাংশন শেষ করেনি ইত্যাদি etc. স্ট্রিংয়ের সাথে EM
লাকাতোস গিউলা

1
সেই সমস্ত সময়ের জন্যও সহায়ক যখন লিন্টারটি "ব্লাহ ব্লাহ ব্লাহ পরিবর্তে একটি নাম ধ্রুবক ব্যবহার করুন" বলে says প্রতিটি প্রোগ্রামার জানে "" যাদু নয়, তবে গ্রাহকের কাছে এটি ব্যাখ্যা না করাই ভাল।
LizH

28

নাল মান সম্পর্কে চিন্তা না করে আপনি যদি খালি স্ট্রিংয়ের সাথে তুলনা করতে চান তবে নীচেরটি করতে পারেন।

if ("".equals(text))

শেষ পর্যন্ত আপনার যা করা উচিত তা পরিষ্কার করা উচিত। বেশিরভাগ প্রোগ্রামার ধরে ধরে "" "এর অর্থ ফাঁকা স্ট্রিং, কোনও স্ট্রিং নয় যে কেউ কিছু দিতে ভুলে গেছে।

যদি আপনি মনে করেন যে কোনও পারফরম্যান্স সুবিধা রয়েছে তবে এটি পরীক্ষা করা উচিত। আপনি যদি নিজের জন্য এটি পরীক্ষা করার উপযুক্ত না মনে করেন তবে এটির পক্ষে এটি একটি ভাল ইঙ্গিত really

মনে হচ্ছে আপনি এমন কোনও সমস্যা সমাধানের চেষ্টা করছেন যা 15 বছরেরও বেশি বছর আগে ভাষাটির নকশা করা হয়েছিল তখনই সমস্যার সমাধান হয়েছিল।


1
আমি পার্টিতে বেশ দেরি করে ফেলেছি, তবে যেহেতু জাভা স্ট্রিংগুলি পরিবর্তনযোগ্য নয়, তাই আমি বিশ্বাস করি যে একটি জেভিএমের মধ্যে থাকা সমস্ত খালি স্ট্রিং একই স্ট্রিং অবজেক্টের জন্য কেবল আলাদা রেফারেন্স। সুতরাং সহজভাবে নিম্নলিখিতগুলিও সঠিক: if ("" == text)
বিজয় ভাটিয়া

12
@ অজয়ভাটিয়া সমস্যাটি হ'ল আপনি নতুন খালি স্ট্রিং তৈরি করতে পারেন। if ("" == new String())মিথ্যা আরও ভাল পরীক্ষাif(text.isEmpty())
পিটার লরি

1
@ অজয়ভাটিয়া - কেবল যদি স্ট্রিংগুলি অভ্যন্তরীণ করা হয়। stackoverflow.com/questions/10578984/ what
is-

9

আপনি যদি সত্যিই একটি স্ট্রিং.এমপিটিওয়াই ধ্রুবক চান তবে আপনি আপনার প্রকল্পে "কনস্ট্যান্টস" (উদাহরণস্বরূপ) নামে একটি ইউটিলিটি স্ট্যাটিক ফাইনাল ক্লাস তৈরি করতে পারেন। এই শ্রেণিটি খালি স্ট্রিং সহ আপনার ধ্রুবকগুলি বজায় রাখবে ...

একই ধারণাটিতে, আপনি জিরো, ওয়ান ইনট কনস্ট্যান্টস তৈরি করতে পারেন ... যা পূর্ণসংখ্যার শ্রেণিতে বিদ্যমান নয়, তবে আমি যেমন মন্তব্য করেছি, লিখতে ও পড়তে কষ্ট হবে:

for(int i=Constants.ZERO; ...) {
    if(myArray.length > Constants.ONE) {
        System.out.println("More than one element");
    }
}

প্রভৃতি


8

অ্যাপাচি স্ট্রিংগটিলগুলিও এই সমস্যার সমাধান করে।

অন্যান্য বিকল্পগুলির ব্যর্থতা:

  • isEmpty () - নাল নিরাপদ নয়। যদি স্ট্রিংটি নাল হয় তবে একটি এনপিই নিক্ষেপ করে
  • দৈর্ঘ্য () == 0 - আবার নাল নিরাপদ নয়। হোয়াইটস্পেসের স্ট্রিংগুলিও বিবেচনা করে না।
  • EMPTY ধ্রুবকের সাথে তুলনা - নাল নিরাপদ নাও হতে পারে। হোয়াইটস্পেসের সমস্যা

মঞ্জুরিপ্রাপ্ত স্ট্রিংটিলগুলি হ'ল অন্য লাইব্রেরি যা প্রায় টেনে আনার জন্য, তবে এটি খুব ভালভাবে কাজ করে এবং নালগুলির জন্য অনেক সময় এবং ঝামেলা যাচাই করে বা এনপিইগুলি সুদৃfully়ভাবে পরিচালনা করে।


3
তাই ... মনে হয় শুধুমাত্র নিরাপদ বিকল্প ভয়াবহ Yoda শর্ত হল: "".equals(s)?
মিথ্যা রায়ান

8

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

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

  • বিগডিসিমাল.জিরো, তবে কোনও অ্যাবস্ট্রাক্ট কালেকশন নেই EM এমপিটিওয়াই, স্ট্রিং.ইএমপিটি
  • অ্যারে.লেন্থ তবে লিস্ট.সাইজ ()
  • তালিকা.এডিডি (), সেট.এডিডি () তবে ম্যাপ.পুট (), বাইটবফার.পুট () এবং আসুন স্ট্রিংবিল্ডার.এপেন্ড (), স্ট্যাক.পুশ () ভুলে যাবেন না

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

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

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

5

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

আপনি যদি সত্যিই একটি EmptyStringধ্রুবক চান , এটি নিজেকে তৈরি করুন। তবে এটি যা করবে তা আরও বেশি ভার্বোজ কোডকে উত্সাহিত করবে; এটি করে কোনও লাভ হবে না


27
x = String.Emptyচেয়ে ভাল অভিপ্রায় জানায় x = ""। পরেরটি দুর্ঘটনাজনিত ভুল হতে পারে। কখনও কোনও লাভ হয় না তা বলা ভুল।
জেফ্রি এল হুইলেটজ

@ জেফ্রি: আমি মনে করি না আমি বিশেষভাবে একমত। এটি এইগুলির মধ্যে একটি যেখানে আমি মনে করি কোনও কঠোর এবং দ্রুত নিয়ম নেই।
ডোনাল ফেলো

হ্যাঁ, এটি উল্লেখ করা গুরুত্বপূর্ণ যে জাভা সংকলক স্ট্রিং পুলটিতে একটি নতুন উদাহরণ তৈরি করার আগে স্ট্রিং লিটারেলগুলি ইতিমধ্যে বিদ্যমান কিনা তা পরীক্ষা করে।
আরডিএস

1
@ জেফ্রি - এটা জেনে যে এটি একটি খুব পুরানো এবং বিষয়গত আলোচনা। x = String.Emptyঅভিপ্রায় প্রকাশ, সত্য। তবে ধরুন যে ভাষাটি একটি ধ্রুবক সরবরাহ করে String.Empty, আপনি যখন মুখোমুখি হন x = ""তখনও আপনি ঠিক সেই উদ্দেশ্য সম্পর্কে ঠিক তেমন জানেন যে এমন ধ্রুবক নেই। আপনার গ্যারান্টির প্রয়োজন হবে যে পৃথিবীর জাভা কোডের সমস্ত জায়গাগুলিতে যেখানে খালি স্ট্রিং ইন্টেন্ডেট ছিল ""সেগুলি আপনার উল্লেখ করা তথ্য পাওয়ার জন্য ব্যবহার করবেন না । হাস্যকরভাবে, সি # একটি ধ্রুবক ব্যবহার করে এবং এর ব্যবহারকে উত্সাহ দেয়, আমি যেমন বলেছিলাম, আমি জানি এটি একটি অত্যন্ত স্বতঃস্ফূর্ত আলোচনা।
চিককোডোরো

@ চিককোডোরো - হ্যাঁ, এটি সত্য। এ কারণেই খালি স্ট্রিং আক্ষরিকটি ""অবৈধ হওয়া উচিত, দুর্ঘটনাগুলিকে উড়িয়ে দেওয়া। ঠাট্টা করছি!
জেফরি এল হুইটলেজ

4

নোয়েল এম যা বলেছিলেন তাতে যুক্ত করতে, আপনি এই প্রশ্নটি দেখতে পারেন এবং এই উত্তরটি দেখায় যে ধ্রুবকটি পুনরায় ব্যবহৃত হয়েছে।

http://forums.java.net/jive/message.jspa?messageID=17122

স্ট্রিং ধ্রুবক সর্বদা "অভ্যন্তরীণ" থাকে তাই এ ধরণের ধ্রুবকের সত্যিকারের প্রয়োজন নেই।

String s=""; String t=""; boolean b=s==t; // true

1
লিঙ্কটি মারা গেছে।
ডাইটার

3

আমি বুঝতে পারি যে আমি যখনই স্ট্রিং আক্ষরিক "" টাইপ করি, স্ট্রিং পুলে একই স্ট্রিং অবজেক্টটি রেফারেন্স করা হয়।
এরকম কোনও গ্যারান্টি নেই। এবং আপনি আপনার আবেদনে এটির উপর নির্ভর করতে পারবেন না, এটি সিদ্ধান্ত নিতে সম্পূর্ণ jvm।

বা ভাষা নির্মাতারা কি কেবল আমার মতামত ভাগ করে নিলেন?
হাঁ। আমার কাছে এটি খুব কম অগ্রাধিকারের জিনিস বলে মনে হচ্ছে।


6
এরকম কোনও গ্যারান্টি নেই ... হ্যাঁ, জেএলএস বলে যে এটি হওয়া উচিত।
টিম স্টোন

@ টিম আপনি 'ইন্টার্ন' কল না করা পর্যন্ত নয়। প্রোগ্রামের মাধ্যমে দুটি সমান বড় স্ট্রিং তৈরি করা এবং পরীক্ষা করা সহজ।
নিকিতা রাইবাক

@ টিম উদাহরণস্বরূপ, একটি + = "এ" পুনরাবৃত্তি করুন ; 100 বার, এবং পরীক্ষা করে একই করুন ।
নিকিতা রাইবাক

5
আপনি ঠিক বলেছেন, তবে আপনি যা বর্ণনা করেছেন তা কোনও স্ট্রিং আক্ষরিক নয়, বা এমন কোনও অভিব্যক্তি নয় যার ফলাফলের সংকলন সময়ে গ্যারান্টি দেওয়া যেতে পারে (যেমন String username = "Bob" + " " + "Smith";)। কর্মসূচির ভিত্তিতে তৈরি স্ট্রিংগুলির অভ্যন্তরীণ হওয়ার কোনও গ্যারান্টি নেই, যদি না আপনি স্পষ্টভাবে intern()বলেছিলেন যেভাবে আপনি কল করেছেন। ""ওপির দৃশ্যে কোড জুড়ে ফাঁকা স্ট্রিং আক্ষরিক ব্যবহারটি বর্ণনা করা হয়েছে, এটি স্বয়ংক্রিয়ভাবে ইন্টার্নিং ঘটবে case
টিম স্টোন

@ String a = ""; for(int i = 0; i < 100; i++) {a += "a";} String b = ""; for(int i = 0; i < 100; i++) {b += "b";} a.intern(); b.intern();এখনই টিম করুন aএবং পার্মজেনে bএকই মেমরির অবস্থানটির দিকে নির্দেশ করুন। এই নিবন্ধটি
1ac0

1

দেরীতে উত্তর, তবে আমি মনে করি এটি এই বিষয়টিতে নতুন কিছু যুক্ত করে।

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

একটি ধ্রুবক কার্যকর হবে কারণ এটি নির্দিষ্ট কোড ত্রুটিটিকে লক্ষ্য না করে আটকাবে।

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

ওটিওএইচ, EMPTY নামে একটি লাইব্রেরি ধ্রুবক, যদি একই ত্রুটির সাপেক্ষে, EM PTY এর মতো কোনও কিছুর জন্য একটি সংকলক ত্রুটি তৈরি করে।

নিজের ধ্রুবকের সংজ্ঞা দেওয়া আরও ভাল। কেউ ভুল করেও এর সূচনা পরিবর্তন করতে পারে তবে এর বিস্তৃত ব্যবহারের কারণে এই জাতীয় ত্রুটির প্রভাব একক ব্যবহারের ক্ষেত্রে ত্রুটির চেয়ে লক্ষ্য না করা আরও কঠিন হবে।

আক্ষরিক মানগুলির পরিবর্তে ধ্রুবক ব্যবহার করে আপনি যে সাধারণ সুবিধা পান তা এটি of লোকেরা সাধারণত স্বীকৃতি দেয় যে কয়েক ডজন জায়গায় ব্যবহৃত একটি মানের জন্য ধ্রুবক ব্যবহার করা আপনাকে সেই মানটি কেবলমাত্র এক জায়গায় আপডেট করতে দেয়। যে বিষয়টি প্রায়শই স্বীকার করা হয় তা হ'ল এটিও সেই মানটিকে দুর্ঘটনাক্রমে সংশোধন হতে বাধা দেয়, কারণ এই ধরনের পরিবর্তনটি সর্বত্র প্রদর্শিত হবে। সুতরাং, হ্যাঁ, "" EMPTY এর চেয়ে ছোট, তবে EMPTY "" এর চেয়ে বেশি নিরাপদ।

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


-16

যারা দাবী করে ""এবং String.Emptyবিনিময়যোগ্য বা এটি ""ভাল, তাদের পক্ষে আপনি খুব ভুল।

প্রতিবার আপনি myVariable = "" এর মতো কিছু করেন; আপনি একটি বস্তুর উদাহরণ তৈরি করছেন। জাভার স্ট্রিং অবজেক্টে যদি একটি EMPTY সর্বজনীন ধ্রুব থাকে, তবে কেবলমাত্র "" অবজেক্টের উদাহরণ থাকতে পারে "

যেমন: -

String.EMPTY = ""; //Simply demonstrating. I realize this is invalid syntax

myVar0 = String.EMPTY;
myVar1 = String.EMPTY;
myVar2 = String.EMPTY;
myVar3 = String.EMPTY;
myVar4 = String.EMPTY;
myVar5 = String.EMPTY;
myVar6 = String.EMPTY;
myVar7 = String.EMPTY;
myVar8 = String.EMPTY;
myVar9 = String.EMPTY;

10 (স্ট্রিং.এমপিটিওয়াই সহ 11) পয়েন্টার 1 টি অবজেক্টে

বা: -

myVar0 = "";
myVar1 = "";
myVar2 = "";
myVar3 = "";
myVar4 = "";
myVar5 = "";
myVar6 = "";
myVar7 = "";
myVar8 = "";
myVar9 = "";

10 পয়েন্টার 10 বস্তু

এটি অদক্ষ এবং বড় অ্যাপ্লিকেশন জুড়ে, তাৎপর্যপূর্ণ হতে পারে।

সম্ভবত জাভা সংকলক বা রান-টাইম স্বয়ংক্রিয়ভাবে একই দৃষ্টান্তের সমস্ত দর্শন "" নির্দেশ করতে যথেষ্ট দক্ষ, তবে এটি নির্ধারণ করতে অতিরিক্ত প্রসেসিং নিতে পারে না।


9
ভুল, স্ট্যাকওভারফ্লো / প্রশ্ন / 1881922 /… অনুযায়ী স্ট্রিং পুল থেকে স্ট্রিংটি পুনরায় ব্যবহার করা হবে।
রিয়েলহটোতো

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

1
আমি সন্দেহ করি যে আপনার পারফর্মেন্স যুক্তি বৈধ কারণ জেএলএস বলে যে একটি ধ্রুবকটি সংকলনের সময় আক্ষরিক হিসাবে বিবেচিত হবে ( ডক্টস.ওরকল / জাজাসে / স্পেকস / জেলস / এস //html/jls-3.html#jls-3.10)। 5 )। পঠনযোগ্যতা একটি ভাল যুক্তি।
রিয়েলহটোতো

3
@ অ্যান্টনিস্মিত - আমার ধারণা আমি আপনাকে জাভাটি আরও কিছুটা অধ্যয়ন করতে হবে বা সম্ভবত আপনি এখনই নিজের ত্রুটিটি জানেন। জাভা স্ট্রিং পরিবর্তনযোগ্য এবং একটি পুল হয়। সুতরাং একটি জেভিএম-তে কেবল "" স্ট্রিং অবজেক্ট রয়েছে, কোডটিতে এটি যতবার পাওয়া যায় তা নয়। স্ট্রিং খালি কিনা তা আপনি পরীক্ষা করে দেখতে পারেনif (text == "")
অজয় ভাটিয়া

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