জাভাতে আপনি স্ট্রিং যখন একটি শ্রেণি হয় কেন + অপারেটরের সাথে স্ট্রিং যুক্ত করতে পারবেন? কোডটিতে String.java
আমি এই অপারেটরের জন্য কোনও প্রয়োগ খুঁজে পাইনি। এই ধারণাটি কি বস্তুগত অবস্থানকে লঙ্ঘন করে?
জাভাতে আপনি স্ট্রিং যখন একটি শ্রেণি হয় কেন + অপারেটরের সাথে স্ট্রিং যুক্ত করতে পারবেন? কোডটিতে String.java
আমি এই অপারেটরের জন্য কোনও প্রয়োগ খুঁজে পাইনি। এই ধারণাটি কি বস্তুগত অবস্থানকে লঙ্ঘন করে?
উত্তর:
আসুন জাভাতে নিম্নলিখিত সহজ অভিব্যক্তি তাকান
int x=15;
String temp="x = "+x;
কম্পাইলার ধর্মান্তরিত "x = "+x;
একটি মধ্যে StringBuilder
অভ্যন্তরীণভাবে এবং ব্যবহার .append(int)
করার জন্য স্ট্রিং পূর্ণসংখ্যা "যোগ"।
যে কোনও প্রকার স্ট্রিং রূপান্তর দ্বারা স্ট্রিং টাইপ রূপান্তরিত হতে পারে।
আদিম প্রকার টিয়ের একটি মান x প্রথমে একটি রেফারেন্স মানটিতে রূপান্তরিত হয় যেন এটি কোনও উপযুক্ত শ্রেণীর উদাহরণ তৈরির এক্সপ্রেশনকে (§15.9) যুক্তি হিসাবে দিয়ে:
- যদি টি বুলিয়ান হয়, তবে নতুন বুলিয়ান (এক্স) ব্যবহার করুন।
- যদি টি চর হয়, তবে নতুন অক্ষর (এক্স) ব্যবহার করুন।
- টি যদি বাইট, সংক্ষিপ্ত বা ইনট হয় তবে নতুন পূর্ণসংখ্যা (এক্স) ব্যবহার করুন।
- টি যদি দীর্ঘ হয় তবে নতুন লং (এক্স) ব্যবহার করুন।
- যদি টি ফ্লোট হয় তবে নতুন ফ্লোট (এক্স) ব্যবহার করুন।
- যদি টি ডাবল হয় তবে নতুন ডাবল (এক্স) ব্যবহার করুন।
এই রেফারেন্স মানটি স্ট্রিং রূপান্তর দ্বারা স্ট্রিং টাইপ রূপান্তরিত হয়।
এখন কেবলমাত্র রেফারেন্স মানগুলি বিবেচনা করা দরকার:
- যদি রেফারেন্সটি নাল হয় তবে এটি "নাল" স্ট্রিংয়ে রূপান্তরিত হয় (চারটি ASCII অক্ষর n, u, l, l)।
- অন্যথায় রূপান্তরটি এমনভাবে সঞ্চালিত হয় যেন কোনও আর্গুমেন্ট ছাড়াই রেফারেন্সযুক্ত অবজেক্টের টো স্ট্রিং পদ্ধতির ডাকে; তবে যদি স্ট্রিং পদ্ধতিটি চাওয়ার ফলাফলটি নাল হয় তবে তার পরিবর্তে "নাল" স্ট্রিংটি ব্যবহৃত হয়।
টোস্ট্রিং পদ্ধতিটি আদিম শ্রেণীর অবজেক্ট (§4.3.2) দ্বারা সংজ্ঞায়িত করা হয়েছে। অনেকগুলি শ্রেণি এটিকে ওভাররাইড করে, উল্লেখযোগ্যভাবে বুলিয়ান, চরিত্র, পূর্ণসংখ্যা, লং, ফ্লোট, ডাবল এবং স্ট্রিং।
স্ট্রিং রূপান্তর প্রসঙ্গে বিশদ জানতে §5.4 দেখুন।
স্ট্রিং কনটেনটেশন অনুকূলিতকরণ: একটি ইন্টারমিডিয়েট স্ট্রিং অবজেক্ট তৈরি করা এবং তারপরে এড়াতে কোনও বাস্তবায়ন এক ধাপে রূপান্তর এবং সম্পাদন করতে পারে। পুনরাবৃত্ত স্ট্রিং কন্ডেটিংয়ের কার্যকারিতা বাড়ানোর জন্য, একটি জাভা সংকলক স্ট্রিংবফার ক্লাস বা অনুরূপ কৌশল ব্যবহার করতে পারে যে কোনও এক্সপ্রেশনের মূল্যায়নের মাধ্যমে তৈরি করা ইন্টারমিডিয়েট স্ট্রিং অবজেক্টগুলির সংখ্যা হ্রাস করতে।
আদিম ধরণের জন্য, একটি বাস্তবায়ন একটি আদিম প্রকারটি সরাসরি স্ট্রিংয়ে রূপান্তর করে একটি মোড়কের বস্তুর তৈরি অপসারণ করতে পারে।
অপ্টিমাইজড সংস্করণটি প্রথমে প্রথমে পুরো মোড়ক স্ট্রিং রূপান্তরটি করবে না।
এটি আদিম রূপান্তর ছাড়াই সংকলক দ্বারা ব্যবহৃত একটি অনুকূলিত সংস্করণটির একটি ভাল চিত্র, যেখানে আপনি পটভূমিতে স্ট্রিংবিল্ডারে রূপান্তরকারী জিনিসগুলি দেখতে পাচ্ছেন:
http://caprazzi.net/posts/java-bytecode-string-concatenation-and-stringbuilder/
এই জাভা কোড:
public static void main(String[] args) {
String cip = "cip";
String ciop = "ciop";
String plus = cip + ciop;
String build = new StringBuilder(cip).append(ciop).toString();
}
এটি উত্পন্ন করে - দেখুন দুটি কনটেনটেশন শৈলী কীভাবে একেবারে একই বাইকোডে নিয়ে যায়:
L0
LINENUMBER 23 L0
LDC "cip"
ASTORE 1
L1
LINENUMBER 24 L1
LDC "ciop"
ASTORE 2
// cip + ciop
L2
LINENUMBER 25 L2
NEW java/lang/StringBuilder
DUP
ALOAD 1
INVOKESTATIC java/lang/String.valueOf(Ljava/lang/Object;)Ljava/lang/String;
INVOKESPECIAL java/lang/StringBuilder.<init>(Ljava/lang/String;)V
ALOAD 2
INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString()Ljava/lang/String;
ASTORE 3
// new StringBuilder(cip).append(ciop).toString()
L3
LINENUMBER 26 L3
NEW java/lang/StringBuilder
DUP
ALOAD 1
INVOKESPECIAL java/lang/StringBuilder.<init>(Ljava/lang/String;)V
ALOAD 2
INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString()Ljava/lang/String;
ASTORE 4
L4
LINENUMBER 27 L4
RETURN
উপরের উদাহরণটি এবং প্রদত্ত উদাহরণে উত্স কোডের উপর ভিত্তি করে বাইট কোডটি কীভাবে উত্পন্ন হয় তা দেখে আপনি লক্ষ্য করতে পারবেন যে সংকলকটি নীচের বিবৃতিটি অভ্যন্তরীণভাবে রূপান্তর করেছে
cip+ciop;
মধ্যে
new StringBuilder(cip).append(ciop).toString();
অন্য কথায়, +
স্ট্রিং কনটেন্টেশন অপারেটর কার্যকরভাবে আরও ভার্জোজ StringBuilder
আইডিয়ামের জন্য একটি শর্টহ্যান্ড ।
এটি জাভা সংকলক বৈশিষ্ট্য যা +
অপারেটরের ক্রিয়াকলাপ পরীক্ষা করে । এবং অপারেন্ডগুলির উপর ভিত্তি করে এটি বাইট কোড উত্পন্ন করে:
এটি জাভা স্পেস বলে :
অপারেটরগুলি + এবং
-
তাদেরকে অ্যাডিটিভ অপারেটর বলা হয়। অ্যাডিটিভএক্সপ্রেসন: মাল্টিপ্লিকটিভেটিস এক্সপ্রেশনঅ্যাডিটিভ অপারেটরগুলির একই প্রাধান্য রয়েছে এবং সিন্ট্যাক্টিকভাবে বাম সংঘবদ্ধ (তারা বাম থেকে ডানে দলবদ্ধ করে)। যদি কোনও
+
অপারেটরের উভয় অপরেন্ডের ধরণ হয়String
তবে ক্রিয়াকলাপটি স্ট্রিং কনকেন্টেশন।অন্যথায়, অপারেটরের প্রতিটি অপারেন্ডের
+
প্রকারটি অবশ্যই এমন এক প্রকারের হতে হবে যা রূপান্তরযোগ্য (§5.1.8) আদিম সংখ্যার প্রকারে, অথবা একটি সংকলন-সময় ত্রুটি ঘটে।প্রতিটি ক্ষেত্রে, বাইনারি
-
অপারেটরের প্রতিটি অপারেন্ডের প্রকারটি অবশ্যই এমন এক প্রকারের হতে হবে যা রূপান্তরযোগ্য (§5.1.8) আদিম সংখ্যার প্রকারে, অথবা একটি সংকলন-সময় ত্রুটি ঘটে।
স্ট্রিং ক্লাস কীভাবে অপারেটরকে ওভাররাইড করে?
এটা হয় না। সংকলক এটি করে। কঠোরভাবে বলতে গেলে, সংকলক স্ট্রিং অপারেন্ডগুলির জন্য + অপারেটরটিকে ওভারলোড করে।
সবার আগে (+) ওভাররাইড নয় ওভাররাইড হয়
জাভা ভাষা স্ট্রিং কনটেনটেশন অপারেটর (+) এর জন্য বিশেষ সমর্থন সরবরাহ করে, যা জাভা স্ট্রিংজ অবজেক্টের জন্য ওভারলোড করা হয়েছে।
বাম হাতের অপারেন্ড যদি স্ট্রিং হয় তবে এটি কনটেনটেশন হিসাবে কাজ করে।
বাম হাতের অপারেন্ডটি পূর্ণসংখ্যা হলে এটি অতিরিক্ত অপারেটরের হিসাবে কাজ করে
int
এবং তার পরে জাভার সাধারণ নিয়ম প্রয়োগ হয়।
জাভা ভাষা স্ট্রিং কনকেনটেশন অপারেটর (+) এবং অন্যান্য বস্তুর স্ট্রিংয়ে রূপান্তর করার জন্য বিশেষ সহায়তা সরবরাহ করে। StringBuilder
(বা StringBuffer
) শ্রেণি এবং এর append
পদ্ধতির মাধ্যমে স্ট্রিং কনটেনটেশন প্রয়োগ করা হয় ।
+
প্রয়োগ করার সময় অপারেটরের অর্থ String
ভাষা দ্বারা সংজ্ঞায়িত করা হয়, যেমন প্রত্যেকে ইতিমধ্যে লিখেছেন। যেহেতু আপনি এটি যথেষ্ট বিশ্বাসযোগ্য বলে মনে করেন না, তাই এটি বিবেচনা করুন:
ইনটস, ফ্লোটস এবং ডাবলসের আলাদা আলাদা বাইনারি উপস্থাপনা রয়েছে এবং তাই দুটি ফ্লোট যুক্ত করার চেয়ে বিট ম্যানিপুলেশন হিসাবে দুটি ইন্ট যুক্ত করা আলাদা অপারেশন: ইনটসের জন্য আপনি কিছুটা বিট যোগ করতে পারেন, খানিকটা বহন করতে পারবেন এবং ওভারফ্লো পরীক্ষা করতে পারবেন; ফ্লোটগুলির জন্য আপনাকে ম্যান্টিসাস এবং এক্সপোনেন্টদের আলাদাভাবে ডিল করতে হবে।
সুতরাং, নীতিগতভাবে, "সংযোজন" অবজেক্টগুলির "যুক্ত" হওয়ার প্রকৃতির উপর নির্ভর করে। জাভা এটিকে স্ট্রিংয়ের পাশাপাশি ইনটস এবং ফ্লোটস (লম্বা, ডাবলস, ...) এর জন্য সংজ্ঞা দেয়
+
অপারেটর সাধারণত একটি দ্বারা প্রতিস্থাপিত হয় StringBuilder
সময় সঙ্কলন করেন। এই বিষয়ে আরও তথ্যের জন্য এই উত্তরটি দেখুন।
+
অপারেটর দ্বারা প্রতিস্থাপিত হয় না এমন কোন মামলা আছে StringBuilder
?
+
) অপারেটর জাভা ভাষার বৈশিষ্ট্য।