java - software - জাভাতে কোন স্ট্রিং নেই কেন?




জাভা java runtime environment (7)

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

কিন্তু স্ট্রিং এপিআই কেন একটি public static final String Empty = ""; , তাই আমি String.Empty রেফারেন্স ব্যবহার করতে পারে?

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

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

https://code.i-harness.com


Apache StringUtils এই সমস্যা খুব ঠিকানা।

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

  • isEmpty () - না নিরাপদ না। স্ট্রিং নাল হয়, একটি NPE ছুড়ে
  • দৈর্ঘ্য () == 0 - আবার নল নিরাপদ নয়। এছাড়াও অ্যাকাউন্ট হোয়াইটস্পেস স্ট্রিং নিতে না।
  • EMPTY ধ্রুবক তুলনা - নাল নিরাপদ হতে পারে না। হোয়াইটস্পেস সমস্যা

অনুমোদিত স্ট্রিংউটিলগুলি অন্যের কাছে টেনে আনতে অন্য লাইব্রেরি, তবে এটি খুব ভালভাবে কাজ করে এবং প্রচুর পরিমাণে সঞ্চয় করে এবং নুলগুলির জন্য ঝুঁকিপূর্ণ পরীক্ষা বা এনপিইগুলি পরিচালনা করে।


আপনি নিল মান সম্পর্কে উদ্বেজক ছাড়া খালি স্ট্রিং সঙ্গে তুলনা করতে চান, তাহলে আপনি নিম্নলিখিত করতে পারেন।

if ("".equals(text))

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

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

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


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

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

স্ট্রিং ধ্রুবক সবসময় "interned" তাই এই ধ্রুবক জন্য সত্যিই প্রয়োজন নেই।

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

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

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

  • BigDecimal.ZERO, কিন্তু কোনও AbstractCollection.EMPTY, String.EMPTY
  • Array.length কিন্তু তালিকা.size ()
  • List.add (), Set.add () কিন্তু Map.put (), ByteBuffer.put () এবং স্ট্রিংব্লিল্ডার.এপেন্ড (), স্ট্যাক.push () কে ভুলবেন না

"" এবং String.Empty বিনিময়ের জন্য বা "" ভাল "" জন্য, আপনি খুব ভুল।

প্রতিটি সময় আপনি আমার মতামত = "" মত কিছু না; আপনি একটি বস্তুর একটি উদাহরণ তৈরি করা হয়। যদি জাভা এর স্ট্রিং বস্তুর একটি 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 (String.EMPTY সহ 11 পয়েন্টার) পয়েন্টার 1 টি বস্তু

অথবা: -

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

10 পয়েন্টার 10 পয়েন্টার

এটি অদক্ষ এবং একটি বড় অ্যাপ্লিকেশন জুড়ে, উল্লেখযোগ্য হতে পারে।

সম্ভবত জাভা কম্পাইলার বা রান টাইম একই ইনস্ট্যান্সের সমস্ত দৃষ্টান্ত স্বয়ংক্রিয়ভাবে নির্দেশ করার জন্য যথেষ্ট কার্যকরী, তবে এটি দৃঢ়প্রতিজ্ঞতার জন্য অতিরিক্ত প্রক্রিয়া গ্রহণ করতে পারে না।


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

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

হালনাগাদ
আপনার মন্তব্য থেকে প্রশ্ন:

আসলে এই TextBox.setText(""); কি TextBox.setText("");

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

private static final String EMPTY_STRING = "";

এবং তারপর হিসাবে আপনার কোড হিসাবে এটি রেফারেন্স

TextBox.setText(EMPTY_STRING);

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


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

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





java