জাভাতে যখন ভাষার 1.1 সংস্করণে অভ্যন্তরীণ ক্লাসগুলি যুক্ত করা হয়েছিল তখন সেগুলি মূলত 1.0 এর সামঞ্জস্যপূর্ণ কোডে রূপান্তর হিসাবে সংজ্ঞায়িত হয়েছিল। আপনি যদি এই রূপান্তরটির উদাহরণের দিকে লক্ষ্য করেন তবে আমি মনে করি এটি একটি অভ্যন্তর শ্রেণি আসলে কীভাবে কাজ করে তা এটি আরও পরিষ্কার করে দেবে।
আয়ান রবার্টসের উত্তরের কোডটি বিবেচনা করুন:
public class Foo {
int val;
public Foo(int v) { val = v; }
class Bar {
public void printVal() {
System.out.println(val);
}
}
public Bar createBar() {
return new Bar();
}
}
১.০ সামঞ্জস্যপূর্ণ কোডে রূপান্তরিত হলে, সেই অভ্যন্তর শ্রেণিটি Barএমন কিছুতে পরিণত হবে:
class Foo$Bar {
private Foo this$0;
Foo$Bar(Foo outerThis) {
this.this$0 = outerThis;
}
public void printVal() {
System.out.println(this$0.val);
}
}
অভ্যন্তরীণ শ্রেণীর নামটি বহিরাগত শ্রেণীর নামের সাথে পূর্ববর্তী করা যাতে এটি অনন্য করা যায়। একটি লুকানো ব্যক্তিগত this$0সদস্য যুক্ত করা হয়েছে যা বাইরের একটি অনুলিপি রাখে this। এবং সেই সদস্যকে আরম্ভ করার জন্য একটি লুকানো কনস্ট্রাক্টর তৈরি করা হয়।
এবং যদি আপনি createBarপদ্ধতিটি দেখেন তবে এটি এমন কিছুতে রূপান্তরিত হবে:
public Foo$Bar createBar() {
return new Foo$Bar(this);
}
সুতরাং আসুন দেখুন যখন আপনি নিম্নলিখিত কোডটি কার্যকর করেন তখন কি হয়।
Foo f = new Foo(5);
Foo.Bar b = f.createBar();
b.printVal();
প্রথমে আমরা একটি উদাহরণ ইনস্ট্যান্ট করি Fooএবং সদস্যটিকে val5 (অর্থাৎ f.val = 5) তে অন্তর্নিহিত করি ।
এরপরে আমরা কল করব f.createBar(), যা একটি দৃষ্টান্ত ইনস্ট্যান্ট করে Foo$Barএবং সদস্যটিকে (যেমন ) থেকে উত্তীর্ণের this$0মান থেকে আরম্ভ করে ।thiscreateBarb.this$0 = f
অবশেষে আমরা কল b.printVal()যা প্রিন্ট করার চেষ্টা করে b.this$0.valযা f.valযা 5।
এখন এটি একটি অভ্যন্তর শ্রেণীর নিয়মিত ইনস্ট্যান্টেশন ছিল। সেখানে কি ঘটছে যখন শুরু করতে গিয়ে এ আসুন বর্ণন Barবাইরে থেকে Foo।
Foo f = new Foo(5);
Foo.Bar b = f.new Bar();
b.printVal();
আমাদের ১.০ রূপান্তরটি আবার প্রয়োগ করা, সেই দ্বিতীয় লাইনটি এরকম কিছু হয়ে উঠবে:
Foo$Bar b = new Foo$Bar(f);
এটি f.createBar()কলটির সাথে প্রায় অভিন্ন । আবার আমরা একটি দৃষ্টান্ত ইনস্ট্যান্ট করছি Foo$Barএবং this$0সদস্যকে চ-তে শুরু করি। আবার b.this$0 = f,।
এবং আবার যখন আপনি কল করবেন b.printVal(), আপনি মুদ্রণ করছেন b.thi$0.valযা f.val5 হয়।
মূল বিষয়টি মনে রাখবেন যে অভ্যন্তরীণ শ্রেণীর একটি লুকানো সদস্য রয়েছে thisযা বাইরের শ্রেণীর একটি অনুলিপি রাখে । আপনি যখন বাইরের শ্রেণীর মধ্যে থেকে কোনও অভ্যন্তরীণ বর্গ ইনস্ট্যান্ট করেন, এটি স্পষ্টভাবে এর বর্তমান মান দিয়ে সূচনা করে this। আপনি যখন বাইরের শ্রেণীর বাইরে থেকে অভ্যন্তরীণ বর্গটি ইনস্ট্যান্ট করেন, আপনি newকীওয়ার্ডের উপসর্গের মাধ্যমে বহিরাগত শ্রেণীর কোন উদাহরণটি ব্যবহার করবেন তা স্পষ্ট করে নির্দিষ্ট করে দিন ।