"পুরানো" উপায় আউটপুট StringBuilder
একমুখী - ওরিয়েন্টেড ক্রিয়াকলাপ। এই প্রোগ্রামটি বিবেচনা করুন:
public class Example {
public static void main(String[] args)
{
String result = args[0] + "-" + args[1] + "-" + args[2];
System.out.println(result);
}
}
যদি আমরা জেডিকে ৮ বা তার আগের সংকলন করি এবং তারপরে javap -c Example
বাইটকোড দেখতে ব্যবহার করি, আমরা এরকম কিছু দেখতে পাই:
পাবলিক ক্লাস উদাহরণ {
সর্বজনীন উদাহরণ ();
কোড:
0: aload_0
1: ইনভোকেসপেশিয়াল # 1 // পদ্ধতি জাভা / ল্যাং / অবজেক্ট "" <init> ":() ভি
4: ফিরে
পাবলিক স্ট্যাটিক শূন্য মূল (java.lang.String []);
কোড:
0: নতুন # 2 // শ্রেণি জাভা / ল্যাং / স্ট্রিংবিল্ডার
3: ডুপ
4: ইনভোকেসপেশিয়াল # 3 // পদ্ধতি জাভা / ল্যাং / স্ট্রিংবিল্ডার "" <init> ":() ভি
7: aload_0
8: আইকনস্ট_0
9: অ্যালাড
10: invokevirtual # 4 // পদ্ধতি java / lang / StringBuilder.append: (লাজাভা / ল্যাং / স্ট্রিং;) লাজাভা / ল্যাং / স্ট্রিংবিল্ডার;
13: ldc # 5 // স্ট্রিং -
15: invokevirtual # 4 // পদ্ধতি java / lang / StringBuilder.append: (লাজাভা / ল্যাং / স্ট্রিং;) লাজাভা / ল্যাং / স্ট্রিংবিল্ডার;
18: aload_0
19: আইকনস্ট_1
20: অ্যালাড
21: invokevirtual # 4 // পদ্ধতি java / lang / StringBuilder.append: (লাজাভা / ল্যাং / স্ট্রিং;) লাজাভা / ল্যাং / স্ট্রিংবিল্ডার;
24: ldc # 5 // স্ট্রিং -
26: invokevirtual # 4 // পদ্ধতি java / lang / StringBuilder.append: (লাজাভা / ল্যাং / স্ট্রিং;) লাজাভা / ল্যাং / স্ট্রিংবিল্ডার;
29: aload_0
30: আইকনস্ট_2
31: অ্যালাড
32: invokevirtual # 4 // পদ্ধতি java / lang / StringBuilder.append: (লাজাভা / ল্যাং / স্ট্রিং;) লাজাভা / ল্যাং / স্ট্রিংবিল্ডার;
35: invokevirtual # 6 // পদ্ধতি জাভা / ল্যাং / স্ট্রিংবিল্ডার.টো স্ট্রিং :() লাজাভা / ল্যাং / স্ট্রিং;
38: অ্যাস্টোর_1
39: গেসট্যাটিক # 7 // ফিল্ড জাভা / ল্যাং / সিস্টেম.আউট: লাজাভা / আইও / মুদ্রণপ্রবাহ;
42: aload_1
43: invokevirtual # 8 // পদ্ধতি জাভা / io / মুদ্রণপ্রবাহ.প্রিন্টলন: (লাজভা / ল্যাং / স্ট্রিং;) ভি
46: ফিরে
}
আপনি দেখতে পাচ্ছেন, এটি একটি StringBuilder
এবং ব্যবহার করে append
। এই মোটামুটি ডিফল্ট ধারণক্ষমতা যেমন অদক্ষ বিখ্যাত বিল্ট-ইন বাফারে StringBuilder
মাত্র 16 অক্ষর, এবং কোন উপায় জন্য কম্পাইলার আগাম আরো বরাদ্দ করা জানতে, তাই এটি শেষ পর্যন্ত reallocate হচ্ছে। এটি পদ্ধতি কলগুলির একটি গুচ্ছও। (নোট করুন যে জেভিএম মাঝে মাঝে কলগুলির এই নিদর্শনগুলি সনাক্ত ও পুনরায় লিখন করতে পারে, যদিও তাদের আরও দক্ষ করে তোলার জন্য))
জাভা 9 কী উত্পন্ন করে তা দেখুন:
পাবলিক ক্লাস উদাহরণ {
সর্বজনীন উদাহরণ ();
কোড:
0: aload_0
1: ইনভোকেসপেশিয়াল # 1 // পদ্ধতি জাভা / ল্যাং / অবজেক্ট "" <init> ":() ভি
4: ফিরে
পাবলিক স্ট্যাটিক শূন্য মূল (java.lang.String []);
কোড:
0: aload_0
1: আইকনস্টটায়
2: অ্যালাড
3: aload_0
4: আইকনস্ট_1
5: অ্যালোয়াড
6: aload_0
7: আইকনস্ট_2
8: অ্যালাড
9: ইনভোকাডাইনামিক # 2, 0 // ইনভোকডাইনামিক # 0: #ConcatWithConstants: (লাজাভা / ল্যাং / স্ট্রিং; লাজভা / ল্যাং / স্ট্রিং; লাজাভা / ল্যাং / স্ট্রিং;) লাজাভা / ল্যাং / স্ট্রিং;
14: অ্যাস্টোর_1
15: গেসট্যাটিক # 3 // ফিল্ড জাভা / ল্যাং / সিস্টেম.আউট: লাজাভা / আইও / মুদ্রণপ্রবাহ;
18: এলোড_1
19: উদ্দীপনা # 4 // পদ্ধতি জাভা / আইও / মুদ্রণপ্রবাহ.প্রিন্টলন: (লাজভা / ল্যাং / স্ট্রিং;) ভি
22: ফিরে
}
ওহ আমার তবে এটাই খাটো। :-) এটি makeConcatWithConstants
থেকে একটি কল আসে StringConcatFactory
, যা এটি তার জাভাদকে বলে:
স্ট্রিং কনটেনটেশন পদ্ধতিগুলি তৈরির সুবিধার্থে পদ্ধতিগুলি, যা পরিচিত ধরণের জ্ঞাত সংখ্যক যুক্তি দক্ষতার সাথে যুক্ত করতে ব্যবহৃত হতে পারে, সম্ভবত টাইপ অভিযোজন এবং যুক্তির আংশিক মূল্যায়নের পরে। জাভা প্রোগ্রামিং ল্যাংগুয়েজের স্ট্রিং কনটেনটেশন বৈশিষ্ট্যটিকে সমর্থন করার জন্য এই পদ্ধতিগুলি সাধারণত invokedynamic
কল সাইটগুলির জন্য বুটস্ট্র্যাপ পদ্ধতি হিসাবে ব্যবহৃত হয় ।