কেন আমরা অ স্থিতিশীল অভ্যন্তর শ্রেণিতে স্থির পদ্ধতি রাখতে পারি না?
আমি যদি অভ্যন্তরীণ বর্গকে স্থির করে তুলি তবে এটি কাজ করে। কেন?
static
কেন আমরা অ স্থিতিশীল অভ্যন্তর শ্রেণিতে স্থির পদ্ধতি রাখতে পারি না?
আমি যদি অভ্যন্তরীণ বর্গকে স্থির করে তুলি তবে এটি কাজ করে। কেন?
static
উত্তর:
কোনও অভ্যন্তরীণ শ্রেণীর উদাহরণ উদাহরণস্বরূপ তার বাহ্যিক শ্রেণীর উদাহরণের সাথে সম্পর্কিত, এটি কোনও স্ট্যাটিক পদ্ধতি নিজেই সংজ্ঞায়িত করতে পারে না। যেহেতু একটি স্ট্যাটিক নেস্টেড শ্রেণি সরাসরি তার ঘের ক্লাসে সংজ্ঞায়িত ভেরিয়েবল বা পদ্ধতিগুলিতে সরাসরি উল্লেখ করতে পারে না, এটি কেবল কোনও বস্তুর রেফারেন্সের মাধ্যমে সেগুলি ব্যবহার করতে পারে, এটি স্থির নেস্টেড ক্লাসে স্থির পদ্ধতি ঘোষণা করা নিরাপদ।
A.B.sync(X)
বা এমনকি (এ এর মধ্যে থেকে) B.sync(x)
?
অ স্থিতিশীল অভ্যন্তর শ্রেণিতে স্থিতিশীল পদ্ধতির অনুমতি দেওয়ার পক্ষে খুব বেশি কিছু নেই; আপনি কিভাবে এটি অ্যাক্সেস করতে হবে? আপনি কোনও বহিরাগত শ্রেণীর উদাহরণ না দিয়ে কোনও অ স্থিতিশীল অভ্যন্তর শ্রেণীর উদাহরণ অ্যাক্সেস করতে পারবেন না (অন্তত প্রাথমিকভাবে)। অ-স্থিতিশীল অভ্যন্তর শ্রেণি তৈরি করার কোনও খাঁটি স্থির উপায় নেই।
বাইরের শ্রেণীর জন্য Outer
, আপনি test()
এই জাতীয় স্থিতির পদ্ধতিতে অ্যাক্সেস করতে পারেন :
Outer.test();
স্থির অভ্যন্তর শ্রেণীর জন্য Inner
, আপনি এর স্থিতিশীল পদ্ধতিটি এখানে অ্যাক্সেস করতে পারেন innerTest()
:
Outer.Inner.innerTest();
তবে, যদি Inner
স্থির না হয় , তবে পদ্ধতিটি উল্লেখ করার জন্য এখন কোনও বিশুদ্ধ স্থির উপায় নেই innertest
। অ স্থিতিশীল অভ্যন্তর শ্রেণিগুলি তাদের বাইরের শ্রেণির একটি নির্দিষ্ট উদাহরণের সাথে আবদ্ধ। একটি ফাংশন একটি ধ্রুবক থেকে পৃথক, Outer.Inner.CONSTANT
যাতে কোনও ফাংশন কলটি Outer.Inner.staticFunction();
নয় এমনভাবে কোনও রেফারেন্সটি দ্ব্যর্থহীন হওয়ার গ্যারান্টিযুক্ত । ধরা যাক আপনার কাছে Inner.staticFunction()
সেই কলগুলি রয়েছে getState()
, যা সংজ্ঞায়িত হয়েছেOuter
। যদি আপনি এই স্থিতিশীল ফাংশনটি চালিত করার চেষ্টা করেন তবে আপনার কাছে এখন অভ্যন্তর শ্রেণীর একটি অস্পষ্ট রেফারেন্স রয়েছে। অর্থাত্, অভ্যন্তর শ্রেণীর কোন উদাহরণে আপনি স্থির ফাংশনটি গ্রহণ করেন? এটা গুরুত্বপূর্ণ। দেখুন, বাইরের অবজেক্টের অন্তর্নিহিত রেফারেন্সের কারণে সেই স্থির পদ্ধতিটি উল্লেখ করার পক্ষে সত্যই কোনও স্থিতিশীল উপায় নেই।
পল বেলোরা ঠিক বলেছেন যে ভাষা ডিজাইনাররা এটির অনুমতি দিতে পারত। তারপরে তাদের অ-স্থিতিশীল অভ্যন্তর শ্রেণীর স্থির পদ্ধতিতে বহিরাগত শ্রেণীর অন্তর্নিহিত রেফারেন্সের কোনও অ্যাক্সেস সাবধানতার সাথে বাতিল করতে হবে। এই মুহুর্তে, যদি আপনি স্থিরভাবে ছাড়া বাইরের শ্রেণীর রেফারেন্স না করতে পারেন তবে এটি একটি অভ্যন্তরীণ শ্রেণীর হওয়ার কী মূল্য? এবং যদি স্থির অ্যাক্সেস ঠিক থাকে, তবে কেন পুরো অভ্যন্তর শ্রেণীর স্থির ঘোষণা করবেন না? আপনি যদি কেবলমাত্র অভ্যন্তরীণ বর্গকে নিজেরাই স্থিতিশীল করে তোলেন তবে বাইরের শ্রেণীর সাথে আপনার কোনও অন্তর্নিহিত রেফারেন্স নেই এবং আপনার আর এই অস্পষ্টতা নেই।
আপনি আসলে এমন প্রয়োজন একটি অ-স্ট্যাটিক ভেতরের বর্গ উপর স্ট্যাটিক পদ্ধতি, তারপর আপনি সম্ভবত আপনার নকশা পুনর্বিবেচনা করা প্রয়োজন।
Outer.Inner i = new Outer().new Inner();
এছাড়াও, ভিতরের শ্রেণীর হয় স্ট্যাটিক ঘোষণা করার অনুমতি দেওয়া ধ্রুবক JLS §15.28 অনুযায়ী।
Outer.Inner.staticMethod()
শুধু আপনি অ্যাক্সেস করতে পারেন মত Outer.Inner.CONSTANT
। "আপনি কোনও বাহ্যিক শ্রেণীর উদাহরণ ছাড়াই অ স্থিতিশীল অভ্যন্তর শ্রেণীর উদাহরণ অ্যাক্সেস করতে পারবেন না" " আপনি একটি উদাহরণ প্রয়োজন হবে কেন? Outer
কল করার জন্য আপনার কোনও দৃষ্টান্তের দরকার নেই Outer.staticMethod()
। আমি জানি এটি নিটপিকি কিন্তু আমার বক্তব্যটি এই যে আপনার উত্তরটি এভাবে ফ্রেম করা কোনও অর্থবোধ করে না। ভাষা ডিজাইনাররা চাইলে এটি অনুমতি দিতে পারতেন IM
Outer.Inner.CONSTANT
এবং এর মধ্যে পার্থক্য Outer.Inner.staticMethod()
হ'ল ধ্রুবকের কোনও রেফারেন্সের Outer
মধ্যে যা Inner
ইনস্ট্যান্ট করা হয়েছিল তার উদাহরণটি স্পষ্টভাবে উল্লেখ করার কোনও সুযোগ নেই । Outer.staticMethod()
একই সূত্রটি ভাগ করার জন্য সমস্ত উল্লেখ । Outer.Inner.CONSTANT
একই সূত্রটি ভাগ করার জন্য সমস্ত উল্লেখ । তবে, উল্লেখগুলি Outer.Inner.staticMethod()
অস্পষ্ট: প্রতিটি ক্ষেত্রে বাইরের শ্রেণীর অন্তর্নিহিত রেফারেন্সের কারণে "স্থিতিশীল" রাষ্ট্রটি সত্যই স্থির নয় Inner
। এটি অ্যাক্সেস করার সত্যিকারের দ্ব্যর্থহীন, স্থির উপায় নেই way
Outer.this
। আমি জাভা ভাষার ডিজাইনারদের সাথে একমত হই যে অভ্যন্তরীণ ক্লাসগুলিতে স্থির পদ্ধতি বা চূড়ান্ত নয় এমন স্ট্যাটিক ক্ষেত্রগুলিকে অনুমতি দেওয়ার কোনও কারণ নেই, কারণ অভ্যন্তরীণ শ্রেণীর প্রতিটি জিনিসই বদ্ধ শ্রেণির প্রসঙ্গে থাকতে হবে।
আমার একটি তত্ত্ব আছে, যা সঠিক হতে পারে বা নাও পারে।
প্রথমত, জাভাতে কীভাবে অভ্যন্তরীণ ক্লাসগুলি প্রয়োগ করা হয় সে সম্পর্কে আপনার কিছু জিনিস জানা উচিত। মনে করুন আপনি এই ক্লাসটি পেয়েছেন:
class Outer {
private int foo = 0;
class Inner implements Runnable {
public void run(){ foo++; }
}
public Runnable newFooIncrementer(){ return new Inner(); }
}
আপনি যখন এটি সংকলন করবেন তখন উত্পন্ন বাইটোকোডটি দেখে মনে হবে আপনি এমন কিছু লিখেছেন:
class Outer {
private int foo = 0;
static class Inner implements Runnable {
private final Outer this$0;
public Inner(Outer outer){
this$0 = outer;
}
public void run(){ this$0.foo++; }
}
public Runnable newFooIncrementer(){ return new Inner(this); }
}
এখন, যদি আমরা অ স্থিতিশীল অভ্যন্তর শ্রেণিতে স্থিতিশীল পদ্ধতিগুলিকে অনুমতি দিয়ে থাকি তবে আপনি সম্ভবত এটির মতো কিছু করতে চাইবেন।
class Outer {
private int foo = 0;
class Inner {
public static void incrFoo(){ foo++; }
}
}
... যা মোটামুটি যুক্তিসঙ্গত Inner
বলে মনে হচ্ছে, ক্লাসটির প্রতি Outer
উদাহরণ হিসাবে একটি অবতার রয়েছে বলে মনে হচ্ছে । তবে যেমনটি আমরা উপরে দেখেছি, অ স্থিতিশীল অভ্যন্তর শ্রেণিগুলি সত্যই স্থির "অভ্যন্তরীণ" শ্রেণীর জন্য কেবল সিনট্যাকটিক চিনি, তাই শেষ উদাহরণটি প্রায় সমান হবে:
class Outer {
private int foo = 0;
static class Inner {
private final Outer this$0;
public Inner(Outer outer){
this$0 = outer;
}
public static void incrFoo(){ this$0.foo++; }
}
}
... যা পরিষ্কারভাবে কাজ করবে না, যেহেতু this$0
অ স্থির। এই ধরণের ব্যাখ্যা দেয় যে স্থির পদ্ধতিগুলি কেন অনুমোদিত নয় (যদিও আপনি যুক্তিটি দিতে পারতেন যে আপনি স্থির পদ্ধতিগুলিকে অনুমতি প্রদান করতে পারবেন যতক্ষণ না তারা ঘেরযুক্ত বস্তুর উল্লেখ না করে) এবং আপনার চূড়ান্ত স্থির ক্ষেত্রগুলি কেন থাকতে পারে না ( যদি বিভিন্ন বস্তু থেকে অ স্থিতিশীল অভ্যন্তর শ্রেণীর উদাহরণগুলি "স্থিতিশীল অবস্থা" ভাগ করে নেওয়া হয়) তবে এটি পাল্টা স্বজ্ঞাত হবে। এছাড়া ব্যাখ্যা দিয়েছে কেন চূড়ান্ত ক্ষেত্র করছে অনুমোদিত (যতদিন তারা এনক্লোজিং অবজেক্ট রেফারেন্স না হিসাবে)।
public static double sinDeg(double theta) { ... }
একটি অভ্যন্তর গণিত ইউটিলিটি ক্লাস লিখতে চাই ?
একমাত্র কারণ হ'ল "আবশ্যক নয়", তবে কেন এটি সমর্থন করার জন্য বিরক্ত করবেন?
কৃত্রিমভাবে, কোনও অভ্যন্তরীণ শ্রেণীর স্থির সদস্য থাকতে নিষেধ করার কোনও কারণ নেই। যদিও এর উদাহরণ Inner
একটি উদাহরণের সাথে সম্পর্কিত Outer
, এটি এখনও Outer.Inner.myStatic
একটি স্থিতিশীল সদস্য রেফারেন্স ব্যবহার করা সম্ভবInner
জাভা যদি সিদ্ধান্ত নেয় তবে ।
আপনার যদি সমস্ত দৃষ্টান্তগুলির মধ্যে কিছু ভাগ করে নেওয়া দরকার তবে আপনি Inner
কেবল Outer
এটিকে স্থির সদস্য হিসাবে রাখতে পারেন । এটি আপনার স্থিতিশীল সদস্যদের ব্যবহারের চেয়ে খারাপ নয় Inner
, যেখানে Outer
এখনও যে কোনও ব্যক্তিগত সদস্য অ্যাক্সেস Inner
করতে পারে (এনক্যাপসুলেশন উন্নত করে না)।
আপনার যদি কোনও Inner
একটি outer
বস্তুর দ্বারা তৈরি করা সমস্ত দৃষ্টান্তগুলির মধ্যে কিছু ভাগ করে নেওয়া প্রয়োজন, তবে Outer
সাধারণ সদস্য হিসাবে শ্রেণিতে রাখাই আরও বোধগম্য ।
"একটি স্ট্যাটিক নেস্টেড বর্গটি কেবলমাত্র একটি শীর্ষ স্তরের শ্রেণি" এই মতকে আমি সম্মত করি না। আমি মনে করি বাহ্যিক শ্রেণীর অংশ হিসাবে একটি স্থিত নেস্টেড শ্রেণি / অভ্যন্তরীণ শ্রেণিকে সত্যই বিবেচনা করা আরও ভাল কারণ তারা বাইরের শ্রেণীর ব্যক্তিগত সদস্যদের অ্যাক্সেস করতে পারে। এবং বহিরাগত শ্রেণীর সদস্যরা "অভ্যন্তরীণ শ্রেণীর সদস্য" পাশাপাশি। সুতরাং অভ্যন্তর শ্রেণিতে স্থির সদস্যকে সমর্থন করার প্রয়োজন নেই। বাইরের শ্রেণিতে একজন সাধারণ / স্থির সদস্যই যথেষ্ট ice
থেকে: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
উদাহরণস্বরূপ পদ্ধতি এবং ভেরিয়েবলগুলির মতো, একটি অভ্যন্তরীণ শ্রেণি তার বদ্ধ শ্রেণীর উদাহরণের সাথে সম্পর্কিত এবং সেই বস্তুর পদ্ধতি এবং ক্ষেত্রগুলিতে সরাসরি অ্যাক্সেস রয়েছে access এছাড়াও, কারণ কোনও অভ্যন্তর শ্রেণি একটি উদাহরণের সাথে সম্পর্কিত, এটি কোনও স্থির সদস্যকে নিজেই সংজ্ঞায়িত করতে পারে না।
ওরাকলের ব্যাখ্যাটি হ'ল স্তরের এবং হস্তবাহিত। যেহেতু কোনও অভ্যন্তরীণ শ্রেণীর মধ্যে স্থির সদস্যদের প্রিম্পট করার কোনও প্রযুক্তিগত বা সিনট্যাক্টিক কারণ নেই (এটি সি # এর মতো অন্যান্য ভাষায় অনুমোদিত) জাভা ডিজাইনারদের অনুপ্রেরণা সম্ভবত ধারণাগত স্বাদ এবং / বা প্রযুক্তিগত সুবিধার বিষয় ছিল।
এখানে আমার জল্পনা:
শীর্ষ-স্তরের শ্রেণীর বিপরীতে, অভ্যন্তরীণ শ্রেণিগুলি উদাহরণ-নির্ভর: অভ্যন্তরীণ-শ্রেণীর উদাহরণটি এর বাইরের শ্রেণীর প্রত্যেকটির উদাহরণের সাথে যুক্ত এবং তাদের সদস্যদের সরাসরি প্রবেশাধিকার রয়েছে। এগুলি জাভাতে থাকার জন্য প্রধান প্রেরণা। অন্য উপায় প্রকাশ: একটি ভিতরের ক্লাস হয় জন্য বোঝানো একটি বাইরের বর্গ উদাহরণস্বরূপ প্রেক্ষাপটে ইনস্ট্যান্স। বাহ্যিক শ্রেণীর উদাহরণ ব্যতীত, অভ্যন্তরীণ শ্রেণীর বাইরের শ্রেণীর অন্যান্য উদাহরণ সদস্যদের চেয়ে বেশি ব্যবহারযোগ্য হওয়া উচিত নয় । আসুন এটি অভ্যন্তরীণ শ্রেণীর উদাহরণ-নির্ভর আত্মা হিসাবে উল্লেখ করুন ।
স্থির সদস্যদের প্রকৃতি (যা বস্তু-ভিত্তিক নয়) উদাহরণ-নির্ভরতার সাথে সংঘর্ষে লিপ্ত হয় অভ্যন্তরীণ শ্রেণির আত্মার (যা বস্তু-কেন্দ্রিক) কারণ আপনি বাইরের শ্রেণীর উদাহরণ ছাড়াই কোনও অভ্যন্তরীণ শ্রেণির স্থিতিশীল সদস্যকে কল করতে / ডাকতে পারেন by যোগ্য অভ্যন্তর শ্রেণীর নাম ব্যবহার করে।
বিশেষত স্ট্যাটিক ভেরিয়েবলগুলি অন্য কোনও উপায়ে আপত্তিজনক হতে পারে: বাইরের শ্রেণীর বিভিন্ন উদাহরণের সাথে যুক্ত একটি অভ্যন্তরীণ শ্রেণির দুটি উদাহরণ স্থিতিশীল ভেরিয়েবলগুলি ভাগ করতে পারে। যেহেতু ভেরিয়েবলগুলি রাষ্ট্রের একটি উপাদান, তাই অভ্যন্তরীণ দুটি শ্রেণীর উদাহরণগুলি বাস্তবে তাদের সাথে যুক্ত বাইরের শ্রেণীর উদাহরণগুলির সাথে স্বাধীনভাবে রাষ্ট্র ভাগ করে নেবে। স্থিতিশীল ভেরিয়েবলগুলি এইভাবে কাজ করে তা অগ্রহণযোগ্য নয় (আমরা ওওপি বিশুদ্ধতার সাথে এটি জাভায় সমঝোতা হিসাবে মেনে নিই) তবে অভ্যন্তরীণ শ্রেণিতে যার দ্বারা ইতিমধ্যে বহিরাগত শ্রেণীর উদাহরণগুলির সংমিশ্রণ রয়েছে তাদেরকে অনুমতি দিয়ে আরও গভীর অপরাধ করার পক্ষে যুক্তি রয়েছে there's নকশা করে. অন্তর্নিহিত আত্মার পক্ষে অভ্যন্তরীণ শ্রেণীর মধ্যে স্থিতিশীল সদস্যদের মজবুত করা এই গভীর OOP অপরাধকে ছড়িয়ে দেওয়ার অতিরিক্ত বোনাসকে কাটাচ্ছে।
অন্যদিকে, স্ট্যাটিক ধ্রুবক দ্বারা এ জাতীয় কোনও অপরাধ প্রেরণ করা হয়নি, যা অর্থপূর্ণভাবে রাষ্ট্র গঠন করে না এবং তাই এগুলি অনুমোদিত। উদাহরণ-নির্ভর চেতনার সাথে সর্বাধিক ধারাবাহিকতার জন্য স্থির ধ্রুবককে কেন নিষেধ করবেন না ? সম্ভবত কারণ স্থিরকারীদের প্রয়োজনের তুলনায় বেশি স্মৃতি গ্রহণের প্রয়োজন নেই (যদি তারা অস্থিতিশীল হতে বাধ্য হয় তবে তারা প্রতিটি অভ্যন্তরীণ শ্রেণিতে নকল করা হয় যা সম্ভাব্য অপব্যয়যোগ্য) waste অন্যথায় আমি ব্যতিক্রমের কারণটি কল্পনা করতে পারি না।
এটি শৈল-যুক্তিযুক্ত যুক্তি নাও হতে পারে তবে আইএমও বিষয়টি সম্পর্কে ওরাকলের কর্সার মন্তব্যটির সর্বাধিক অর্থ অনুধাবন করে।
সংক্ষিপ্ত উত্তর: বেশিরভাগ প্রোগ্রামারদের মানসিক মডেলটি কীভাবে স্কোপ কাজ করে তা জাভ্যাক দ্বারা ব্যবহৃত মডেল নয়। আরও স্বজ্ঞাত মডেলটির সাথে মিলে গেলে জাভাক কীভাবে কাজ করে তার একটি বড় পরিবর্তন প্রয়োজন।
অভ্যন্তরীণ ক্লাসে স্থির সদস্যদের কাঙ্ক্ষিত হওয়ার মূল কারণটি কোড পরিষ্কার-পরিচ্ছন্নতার জন্য - কেবলমাত্র কোনও অভ্যন্তরীণ শ্রেণীর দ্বারা ব্যবহৃত স্ট্যাটিক সদস্যকে বাইরের শ্রেণিতে স্থাপনের পরিবর্তে তার ভিতরে থাকতে হবে। বিবেচনা:
class Outer {
int outID;
class Inner {
static int nextID;
int id = nextID++;
String getID() {
return outID + ":" + id;
}
}
}
যখন আমি অযোগ্য সনাক্তকারী "আউটআইডি" ব্যবহার করি তখন getID () এ কী চলছে তা বিবেচনা করুন। এই শনাক্তকারীটি যে স্কেপটিতে প্রদর্শিত হবে তা দেখতে এমন কিছু দেখাচ্ছে:
Outer -> Inner -> getID()
এখানে আবার, কারণ জাভ্যাক ঠিক এইভাবে কীভাবে কাজ করে, সুযোগের "আউটার" স্তরটিতে আউটারের স্থির এবং উদাহরণস্বরূপ সদস্য উভয়ই অন্তর্ভুক্ত থাকে। এটি বিভ্রান্তিকর কারণ আমাদের সাধারণত ক্লাসের স্থির অংশটি সুযোগের অন্য স্তর হিসাবে ভাবতে বলা হয়:
Outer static -> Outer instance -> instanceMethod()
\----> staticMethod()
এটি সম্পর্কে চিন্তাভাবনার এই পদ্ধতিতে অবশ্যই স্ট্যাটিকমেথড () কেবলমাত্র আউটারের স্থির সদস্যদের দেখতে পাবে। তবে যদি জাভাক এইভাবে কাজ করে তবে স্থিতিশীল পদ্ধতিতে একটি উদাহরণের পরিবর্তনশীল উল্লেখ করার ফলে "নামটি সমাধান করা যায় না" ত্রুটি হতে পারে। আসলে যা ঘটে তা হ'ল নামটি স্কোপটিতে পাওয়া যায় তবে তারপরে একটি অতিরিক্ত স্তরের চেক কিক করে খুঁজে বের করে যে নামটি একটি উদাহরণ প্রসঙ্গে ঘোষণা করা হয়েছিল এবং একটি স্থির প্রসঙ্গ থেকে রেফারেন্স করা হচ্ছে।
ঠিক আছে, এটি কীভাবে অভ্যন্তরীণ ক্লাসগুলির সাথে সম্পর্কিত? নির্লজ্জভাবে, আমরা মনে করি যে অভ্যন্তরীণ শ্রেণীর কোনও স্থির সুযোগ থাকতে পারে না এমন কোনও কারণ নেই কারণ আমরা এইভাবে কাজ করার সুযোগটি চিত্রিত করছি:
Outer static -> Outer instance -> Inner instance -> getID()
\------ Inner static ------^
অন্য কথায়, অভ্যন্তরীণ শ্রেণিতে স্থির ঘোষণা এবং বাইরের শ্রেণিতে উদাহরণস্বরূপ ঘোষণাগুলি উভয়ই অভ্যন্তরীণ বর্গের উদাহরণ প্রসঙ্গে থাকে তবে এগুলির কোনওটিই অন্যটিতে বাস্তবে বাসা বাঁধে না; উভয় পরিবর্তে আউটরের স্থিতিশীল সুযোগে বাসা বাঁধে।
জাভাক কীভাবে কাজ করে তা ঠিক তা নয় - স্থির এবং দৃষ্টান্তের উভয় সদস্যের জন্য একক স্তরের সুযোগ রয়েছে এবং সর্বদা কঠোরভাবে বাসা বেঁধে থাকে। এমনকি উত্তরাধিকারগুলি সাবক্লাসে ঘোষণাগুলি অনুলিপি করে সুপারক্লাসের স্কোপ না করে প্রয়োগ করা হয়।
জাভাককে অভ্যন্তরীণ শ্রেণির স্থিতিশীল সদস্যদের সমর্থন করার জন্য হয় স্থিতিশীল এবং উদাহরণস্বরূপ স্কোপগুলি বিভক্ত করতে হবে এবং শাখা প্রশাখা এবং স্কোপ হায়ারারচিতে পুনরায় যোগদান করতে হবে, বা সমস্ত স্তরের প্রেক্ষাপটের ধরণটি ট্র্যাক করতে পরিবর্তনের জন্য এটি তার সাধারণ বুলিয়ান "স্থিতিশীল প্রসঙ্গ" ধারণাটি প্রসারিত করতে হবে বর্তমান সুযোগে নেস্টেড ক্লাসের।
কেন আমরা অ স্থিতিশীল অভ্যন্তর শ্রেণিতে স্থির পদ্ধতি রাখতে পারি না?
দ্রষ্টব্য: একটি অ-স্থিত নেস্টেড শ্রেণি অভ্যন্তর শ্রেণি হিসাবে পরিচিত তাই আপনার কাছে এটি নেই non-static inner class
।
অভ্যন্তরীণ শ্রেণীর উদাহরণটি বাইরের শ্রেণীর সাথে সম্পর্কিত উদাহরণ ছাড়া অস্তিত্ব রাখে না। একটি অভ্যন্তরীণ শ্রেণি স্থির সদস্যদের সংকলনের সময় স্থিরতা ব্যতীত অন্য কোন স্থির সদস্য ঘোষণা করতে পারে না। যদি এটি অনুমোদিত হয় তবে অর্থ সম্পর্কে অস্পষ্টতা থাকতে পারে static
। সেক্ষেত্রে কিছু বিভ্রান্তি হত:
এজন্য ডিজাইনাররা সম্ভবত এই সমস্যাটি একেবারেই না পরিচালনা করার সিদ্ধান্ত নিয়েছিলেন।
আমি যদি অভ্যন্তরীণ বর্গকে স্থির করে তুলি তবে এটি কাজ করে। কেন?
আবার আপনি কোনও অভ্যন্তর শ্রেণীর স্ট্যাটিক করতে পারবেন না বরং আপনি স্থির শ্রেণিকে নেস্টেড হিসাবে ঘোষণা করতে পারেন। সেক্ষেত্রে এই নেস্টেড ক্লাসটি আসলে বাইরের শ্রেণীর অংশ এবং কোনও সমস্যা ছাড়াই স্থির সদস্য থাকতে পারে।
এই বিষয়টি অনেকের দৃষ্টি আকর্ষণ করেছে, এখনও আমি সবচেয়ে সহজ শর্তে ব্যাখ্যা করার চেষ্টা করব।
প্রথমত, http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.4.1 রেফারেন্স সহ প্রথম শ্রেণি / ইন্টারফেস প্রথম উপস্থিতি / অনুরোধের অবিলম্বে শুরু করা হয় স্থায়ী কীওয়ার্ড দ্বারা পূর্বে যে কোনও সদস্যের।
সুতরাং, আমরা যদি কোনও অভ্যন্তরীণ শ্রেণীর মধ্যে একটি স্থিতিশীল সদস্যের সাথে রাখি, তবে এটি অভ্যন্তরীণ শ্রেণির সূচনার দিকে পরিচালিত করবে, বহিরাগত / ঘেরযুক্ত শ্রেণিটি অগত্যা নয়। সুতরাং, আমরা শ্রেণি সূচনা ক্রম বাধাগ্রস্থ করি।
এই বিষয়টিও বিবেচনা করুন যে একটি অ স্থিতিশীল অভ্যন্তর শ্রেণি একটি বদ্ধ / বহিরাগত শ্রেণীর উদাহরণের সাথে সম্পর্কিত। সুতরাং, একটি উদাহরণের সাথে সংযুক্তির অর্থ হ'ল অভ্যন্তরীণ শ্রেণি বাইরের শ্রেণীর উদাহরণের মধ্যে উপস্থিত থাকবে এবং উদাহরণগুলির মধ্যে পৃথক হবে।
বিন্দুটি সরলকরণের জন্য, স্থির সদস্যকে অ্যাক্সেস করার জন্য আমাদের একটি বহিরাগত শ্রেণির একটি উদাহরণ প্রয়োজন, যা থেকে আমাদের আবার অ স্থিতিশীল অভ্যন্তর শ্রেণীর উদাহরণ তৈরি করতে হবে। স্থির সদস্যদের উদাহরণগুলির জন্য আবদ্ধ হওয়ার কথা নয় এবং তাই আপনি একটি সংকলন ত্রুটি পান।
একটি অভ্যন্তর শ্রেণি স্থির নেস্টেড শ্রেণীর থেকে সম্পূর্ণ আলাদা কিছু যদিও উভয় বাক্য গঠনতে একই রকম। স্ট্যাটিক নেস্টেড ক্লাসগুলি গ্রুপিংয়ের জন্য কেবল একটি মাধ্যম যেখানে অভ্যন্তরীণ ক্লাসগুলির একটি দৃ association় সংযোগ রয়েছে - এবং তাদের বহিরাগত শ্রেণির সমস্ত মানগুলিতে অ্যাক্সেস। আপনি কেন একটি অভ্যন্তর শ্রেণি ব্যবহার করতে চান তা নিশ্চিত হওয়া উচিত এবং তারপরে এটি অবশ্যই প্রাকৃতিক হওয়া উচিত যা আপনার ব্যবহার করতে হবে। যদি আপনার কোনও স্থিতিশীল পদ্ধতি ঘোষণা করার দরকার হয় তবে এটি সম্ভবত একটি স্থির নেস্টেড বর্গ যা আপনি যেভাবে চান।
ধরুন বাহ্যিক শ্রেণীর দুটি উদাহরণ রয়েছে এবং তারা উভয়ই অভ্যন্তরীণ শ্রেণিকে ইনস্ট্যান্ট করেছে ow এখন যদি অভ্যন্তরীণ শ্রেণীর একটি স্থিতিশীল সদস্য থাকে তবে এটি সেই সদস্যের কেবল একটি অনুলিপিটি heগল অঞ্চলে রাখবে this এক্ষেত্রে বহিরাগত শ্রেণীর উভয় বস্তুই এটি উল্লেখ করবে একক অনুলিপি এবং তারা এটি একসাথে পরিবর্তন করতে পারে his এই কারণে এই জাভা এই বিধিনিষেধ প্রয়োগ করেছে তাই "ডার্টি রিড" পরিস্থিতি তৈরি করতে পারে this এই যুক্তি সমর্থন করার পক্ষে অন্য একটি শক্ত বক্তব্যটি জাভা এখানে চূড়ান্ত স্থির সদস্যদের অনুমতি দেয়, যাদের মানগুলি হতে পারে না তারা বাইরের শ্রেণীর অবজেক্টের যে কোনও একটি থেকে পরিবর্তিত হয়েছে। আমি ভুল হলে দয়া করে আমাকে দিন।
সবার আগে কেন কেউ অ স্থিতিশীল অভ্যন্তর শ্রেণিতে স্থির সদস্যকে সংজ্ঞায়িত করতে চান? উত্তরটি হ'ল, যাতে বাইরের শ্রেণীর সদস্যরা সেই স্থির সদস্যকে কেবলমাত্র অভ্যন্তরীণ শ্রেণির নাম সহ ব্যবহার করতে পারে, তাই না?
তবে এই ক্ষেত্রে আমরা সরাসরি বাহ্যিক শ্রেণিতে সদস্যকে সংজ্ঞায়িত করতে পারি। যা বাইরের শ্রেণীর উদাহরণের মধ্যে অভ্যন্তরীণ শ্রেণীর সমস্ত বস্তুর সাথে যুক্ত হবে।
নীচের কোড মত,
public class Outer {
class Inner {
public static void method() {
}
}
}
এইভাবে লেখা যেতে পারে
public class Outer {
void method() {
}
class Inner {
}
}
সুতরাং আমার মতে কোডটি জটিল না করার জন্য জাভা ডিজাইনার এই কার্যকারিতাটি মঞ্জুরি দিচ্ছেন না বা আমরা আরও কিছু বৈশিষ্ট্য সহ ভবিষ্যতে প্রকাশে এই কার্যকারিতাটি দেখতে পাচ্ছি।
ক্লাসটিকে একটি সাধারণ ক্ষেত্র হিসাবে বিবেচনা করার চেষ্টা করুন, তবে আপনি বুঝতে পারবেন।
//something must be static. Suppose something is an inner class, then it has static keyword which means it's a static class
Outer.something
স্থিতিশীল হিসাবে অভ্যন্তরীণ শ্রেণীর সদস্যদের রাখা অযথা কারণ আপনি তাদের প্রথম স্থানে অ্যাক্সেস করতে পারবেন না।
আপনি ক্লাসনেম.এমবারনেম ব্যবহার করেন এমন একটি স্ট্যাটিক সদস্য অ্যাক্সেস করার জন্য এটি সম্পর্কে চিন্তা করুন, আমাদের ক্ষেত্রে এটি বাইরেরক্ল্যাশনেম.ইন.এনইনারক্লাসনাম.মেমবারনাম এর মতো কিছু হওয়া উচিত, এখন আপনি দেখতে পাচ্ছেন কেন অভ্যন্তর শ্রেণি স্থির থাকতে হবে ....