কেন আমরা একটি (অ-স্থিতিশীল) অভ্যন্তর শ্রেণিতে স্থির পদ্ধতি রাখতে পারি না?


142

কেন আমরা অ স্থিতিশীল অভ্যন্তর শ্রেণিতে স্থির পদ্ধতি রাখতে পারি না?

আমি যদি অভ্যন্তরীণ বর্গকে স্থির করে তুলি তবে এটি কাজ করে। কেন?


4
কারণ এখন জাভা পুরানো ব্যবসায়িক কাজে ব্যবহৃত এক বিশেষ ধরনের কম্পিউটার ভাষা :) হল
এসইএস

নীচের লাইনটি হ'ল: কারণ তারা এখনও এটি প্রয়োগ করেনি।
ইন্ট্রিপিডিস

1
'অ-স্থির অভ্যন্তর' একটি টাউটোলজি।
লার্নের মারকুইস

আপনি যদি নিজের অভ্যন্তর শ্রেণিটি অন্যের কাছে প্রকাশ করতে না চান এবং আশা করেন যে এটিতে স্থির পদ্ধতি রয়েছে তবে আপনি অভ্যন্তরীণ শ্রেণীর উপর "ব্যক্তিগত" এবং "স্ট্যাটিক" উভয়ই সংশোধনকারীকে রাখতে পারেন।
উইলি জেড

একটি অভ্যন্তরীণ শ্রেণি সংজ্ঞা দ্বারা স্থির নয়। আপনার কাছে একটি স্ট্যাটিক নেস্টেড / সদস্য শ্রেণি, এবং একটি অ স্থিত নেস্টেড / সদস্য শ্রেণি থাকতে পারে। পরেরটি অভ্যন্তরীণ শ্রেণি হিসাবেও পরিচিত। (তথ্যসূত্র: static
জেএলএসের ৮.১.৩

উত্তর:


111

কোনও অভ্যন্তরীণ শ্রেণীর উদাহরণ উদাহরণস্বরূপ তার বাহ্যিক শ্রেণীর উদাহরণের সাথে সম্পর্কিত, এটি কোনও স্ট্যাটিক পদ্ধতি নিজেই সংজ্ঞায়িত করতে পারে না। যেহেতু একটি স্ট্যাটিক নেস্টেড শ্রেণি সরাসরি তার ঘের ক্লাসে সংজ্ঞায়িত ভেরিয়েবল বা পদ্ধতিগুলিতে সরাসরি উল্লেখ করতে পারে না, এটি কেবল কোনও বস্তুর রেফারেন্সের মাধ্যমে সেগুলি ব্যবহার করতে পারে, এটি স্থির নেস্টেড ক্লাসে স্থির পদ্ধতি ঘোষণা করা নিরাপদ।


7
আমি জানি যে একটি অভ্যন্তরীণ শ্রেণি তার বহিরাগত শ্রেণীর উদাহরণের সাথে সম্পর্কিত এবং আমি জানি যে এটি একটি নিরর্থক যে আমরা একটি অভ্যন্তরীণ শ্রেণীর মধ্যে স্থির সদস্য ঘোষণা করতে সক্ষম হয়েছি তবে আমি এখনও জিজ্ঞাসা করছি কেন একটি অভ্যন্তর শ্রেণি স্থির সদস্য ঘোষণা করতে পারে না?
কেরেম

15
সি ++ এ আপনি থাকতে পারেন, তাই এটি জাভা ভাষার একটি বাগ।
শিল্প-প্রতিরোধক

39
বাগ শব্দটি ... আমি মনে করি না যে এই শব্দটির অর্থ আপনি কী ভাবেন এর অর্থ।
শেঠ নেলসন

24
আরও উপযুক্ত বাক্যাংশটি হবে 'মাদারটকার হিসাবে বিরক্তিকর'। জাভা কেন এর জন্য অনুমতি দেয় না বুঝতে পারছেন না। কখনও কখনও আমি পিতামাতার শ্রেণীর বৈশিষ্ট্যগুলি ব্যবহার করার জন্য একটি অভ্যন্তর শ্রেণি চাই, তবে আরও ভাল নামকরণের জন্য স্থির পদ্ধতি রাখি। এর সাথে সহজাত কিছু ভুল আছে কি? :(
আঙ্গাদ

6
যথাযথভাবে। আমি একটি ইউটিলিটি ইনার ক্লাস লিখতে চাই। এর কয়েকটি পদ্ধতির বাইরের শ্রেণীর অ্যাক্সেস থেকে উপকৃত হবে, তাই আমি এটিকে স্থির করতে পারি না, তবে এর কয়েকটি পদ্ধতি কেবল ইউটিলিটি ফাংশন। কেন আমি কল করতে পারি না A.B.sync(X)বা এমনকি (এ এর মধ্যে থেকে) B.sync(x)?
এডওয়ার্ড ফালক

44

অ স্থিতিশীল অভ্যন্তর শ্রেণিতে স্থিতিশীল পদ্ধতির অনুমতি দেওয়ার পক্ষে খুব বেশি কিছু নেই; আপনি কিভাবে এটি অ্যাক্সেস করতে হবে? আপনি কোনও বহিরাগত শ্রেণীর উদাহরণ না দিয়ে কোনও অ স্থিতিশীল অভ্যন্তর শ্রেণীর উদাহরণ অ্যাক্সেস করতে পারবেন না (অন্তত প্রাথমিকভাবে)। অ-স্থিতিশীল অভ্যন্তর শ্রেণি তৈরি করার কোনও খাঁটি স্থির উপায় নেই।

বাইরের শ্রেণীর জন্য Outer, আপনি test()এই জাতীয় স্থিতির পদ্ধতিতে অ্যাক্সেস করতে পারেন :

Outer.test();

স্থির অভ্যন্তর শ্রেণীর জন্য Inner, আপনি এর স্থিতিশীল পদ্ধতিটি এখানে অ্যাক্সেস করতে পারেন innerTest():

Outer.Inner.innerTest();

তবে, যদি Innerস্থির না হয় , তবে পদ্ধতিটি উল্লেখ করার জন্য এখন কোনও বিশুদ্ধ স্থির উপায় নেই innertest। অ স্থিতিশীল অভ্যন্তর শ্রেণিগুলি তাদের বাইরের শ্রেণির একটি নির্দিষ্ট উদাহরণের সাথে আবদ্ধ। একটি ফাংশন একটি ধ্রুবক থেকে পৃথক, Outer.Inner.CONSTANTযাতে কোনও ফাংশন কলটি Outer.Inner.staticFunction();নয় এমনভাবে কোনও রেফারেন্সটি দ্ব্যর্থহীন হওয়ার গ্যারান্টিযুক্ত । ধরা যাক আপনার কাছে Inner.staticFunction()সেই কলগুলি রয়েছে getState(), যা সংজ্ঞায়িত হয়েছেOuter । যদি আপনি এই স্থিতিশীল ফাংশনটি চালিত করার চেষ্টা করেন তবে আপনার কাছে এখন অভ্যন্তর শ্রেণীর একটি অস্পষ্ট রেফারেন্স রয়েছে। অর্থাত্, অভ্যন্তর শ্রেণীর কোন উদাহরণে আপনি স্থির ফাংশনটি গ্রহণ করেন? এটা গুরুত্বপূর্ণ। দেখুন, বাইরের অবজেক্টের অন্তর্নিহিত রেফারেন্সের কারণে সেই স্থির পদ্ধতিটি উল্লেখ করার পক্ষে সত্যই কোনও স্থিতিশীল উপায় নেই।

পল বেলোরা ঠিক বলেছেন যে ভাষা ডিজাইনাররা এটির অনুমতি দিতে পারত। তারপরে তাদের অ-স্থিতিশীল অভ্যন্তর শ্রেণীর স্থির পদ্ধতিতে বহিরাগত শ্রেণীর অন্তর্নিহিত রেফারেন্সের কোনও অ্যাক্সেস সাবধানতার সাথে বাতিল করতে হবে। এই মুহুর্তে, যদি আপনি স্থিরভাবে ছাড়া বাইরের শ্রেণীর রেফারেন্স না করতে পারেন তবে এটি একটি অভ্যন্তরীণ শ্রেণীর হওয়ার কী মূল্য? এবং যদি স্থির অ্যাক্সেস ঠিক থাকে, তবে কেন পুরো অভ্যন্তর শ্রেণীর স্থির ঘোষণা করবেন না? আপনি যদি কেবলমাত্র অভ্যন্তরীণ বর্গকে নিজেরাই স্থিতিশীল করে তোলেন তবে বাইরের শ্রেণীর সাথে আপনার কোনও অন্তর্নিহিত রেফারেন্স নেই এবং আপনার আর এই অস্পষ্টতা নেই।

আপনি আসলে এমন প্রয়োজন একটি অ-স্ট্যাটিক ভেতরের বর্গ উপর স্ট্যাটিক পদ্ধতি, তারপর আপনি সম্ভবত আপনার নকশা পুনর্বিবেচনা করা প্রয়োজন।


6
-1 আপনি এখানে যে কোণটি নিয়েছিলেন তাতে আমার দ্বিমত পোষণ করতে হবে। অবশ্যই আমরা একটি ভেতরের বর্গ টাইপ পাঠাতে পারেন, উদাহরণস্বরূপ Outer.Inner i = new Outer().new Inner();এছাড়াও, ভিতরের শ্রেণীর হয় স্ট্যাটিক ঘোষণা করার অনুমতি দেওয়া ধ্রুবক JLS §15.28 অনুযায়ী।
পল বেলোরা

2
হ্যাঁ, অভ্যন্তরীণ ক্লাসগুলি স্থির স্থিরতা ঘোষণা করতে পারে । স্থির পদ্ধতিগুলির সাথে এর কোনও যোগসূত্র নেই! আপনি অ স্থিতিশীলভাবে একটি স্থিতিশীল পদ্ধতি উল্লেখ করতে পারেন , এটি নিরুৎসাহিত করা হয়। সমস্ত কোড মানের সরঞ্জামগুলি সেই ধরণের রেফারেন্সে এবং ভাল কারণে অভিযোগ করে। এবং আপনি আমার বক্তব্য মিস করেছেন। আমি কখনও বলিনি যে স্থির অভ্যন্তর শ্রেণীর রেফারেন্সের কোনও উপায় নেই। আমি বলেছিলাম একটি অ স্থিতিশীল বাইরের শ্রেণীর অভ্যন্তর শ্রেণির স্থির পদ্ধতিটি উল্লেখ করার জন্য কোনও স্ট্যাটিক উপায় নেই। সুতরাং, এটি রেফারেন্স করার কোন ভাল উপায় নেই।
এডি

25
"অ স্থিতিশীল অভ্যন্তর শ্রেণিতে স্থিতিশীল পদ্ধতির অনুমতি দেওয়ার পক্ষে খুব বেশি কিছু নেই; আপনি কীভাবে এটিকে অ্যাক্সেস করবেন?" আপনি কল করবে Outer.Inner.staticMethod()শুধু আপনি অ্যাক্সেস করতে পারেন মত Outer.Inner.CONSTANT। "আপনি কোনও বাহ্যিক শ্রেণীর উদাহরণ ছাড়াই অ স্থিতিশীল অভ্যন্তর শ্রেণীর উদাহরণ অ্যাক্সেস করতে পারবেন না" " আপনি একটি উদাহরণ প্রয়োজন হবে কেন? Outerকল করার জন্য আপনার কোনও দৃষ্টান্তের দরকার নেই Outer.staticMethod()। আমি জানি এটি নিটপিকি কিন্তু আমার বক্তব্যটি এই যে আপনার উত্তরটি এভাবে ফ্রেম করা কোনও অর্থবোধ করে না। ভাষা ডিজাইনাররা চাইলে এটি অনুমতি দিতে পারতেন IM
পল বেলোরা

1
Outer.Inner.CONSTANTএবং এর মধ্যে পার্থক্য Outer.Inner.staticMethod()হ'ল ধ্রুবকের কোনও রেফারেন্সের Outerমধ্যে যা Innerইনস্ট্যান্ট করা হয়েছিল তার উদাহরণটি স্পষ্টভাবে উল্লেখ করার কোনও সুযোগ নেই । Outer.staticMethod()একই সূত্রটি ভাগ করার জন্য সমস্ত উল্লেখ । Outer.Inner.CONSTANTএকই সূত্রটি ভাগ করার জন্য সমস্ত উল্লেখ । তবে, উল্লেখগুলি Outer.Inner.staticMethod()অস্পষ্ট: প্রতিটি ক্ষেত্রে বাইরের শ্রেণীর অন্তর্নিহিত রেফারেন্সের কারণে "স্থিতিশীল" রাষ্ট্রটি সত্যই স্থির নয় Inner। এটি অ্যাক্সেস করার সত্যিকারের দ্ব্যর্থহীন, স্থির উপায় নেই way
এডি

3
@ এডি আপনি স্ট্যাটিক পদ্ধতিতে উদাহরণ ক্ষেত্রগুলি উল্লেখ করতে পারবেন না, সুতরাং অন্তর্নিহিত উদাহরণ ক্ষেত্রটি উল্লেখ করতে অক্ষমতার সাথে কোনও বিরোধ নেই Outer.this। আমি জাভা ভাষার ডিজাইনারদের সাথে একমত হই যে অভ্যন্তরীণ ক্লাসগুলিতে স্থির পদ্ধতি বা চূড়ান্ত নয় এমন স্ট্যাটিক ক্ষেত্রগুলিকে অনুমতি দেওয়ার কোনও কারণ নেই, কারণ অভ্যন্তরীণ শ্রেণীর প্রতিটি জিনিসই বদ্ধ শ্রেণির প্রসঙ্গে থাকতে হবে।
থিওডোর মুরডক

20

আমার একটি তত্ত্ব আছে, যা সঠিক হতে পারে বা নাও পারে।

প্রথমত, জাভাতে কীভাবে অভ্যন্তরীণ ক্লাসগুলি প্রয়োগ করা হয় সে সম্পর্কে আপনার কিছু জিনিস জানা উচিত। মনে করুন আপনি এই ক্লাসটি পেয়েছেন:

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অ স্থির। এই ধরণের ব্যাখ্যা দেয় যে স্থির পদ্ধতিগুলি কেন অনুমোদিত নয় (যদিও আপনি যুক্তিটি দিতে পারতেন যে আপনি স্থির পদ্ধতিগুলিকে অনুমতি প্রদান করতে পারবেন যতক্ষণ না তারা ঘেরযুক্ত বস্তুর উল্লেখ না করে) এবং আপনার চূড়ান্ত স্থির ক্ষেত্রগুলি কেন থাকতে পারে না ( যদি বিভিন্ন বস্তু থেকে অ স্থিতিশীল অভ্যন্তর শ্রেণীর উদাহরণগুলি "স্থিতিশীল অবস্থা" ভাগ করে নেওয়া হয়) তবে এটি পাল্টা স্বজ্ঞাত হবে। এছাড়া ব্যাখ্যা দিয়েছে কেন চূড়ান্ত ক্ষেত্র করছে অনুমোদিত (যতদিন তারা এনক্লোজিং অবজেক্ট রেফারেন্স না হিসাবে)।


7
তবে এটি কেবল একটি "স্ট্যাটিক প্রসঙ্গ থেকে অ স্থিতিশীল ভেরিয়েবল অ্যাক্সেসের প্রয়াস" টাইপ ত্রুটি - কোনও শীর্ষ স্তরের স্ট্যাটিক পদ্ধতি যদি নিজের শ্রেণীর উদাহরণ ভেরিয়েবল অ্যাক্সেস করার চেষ্টা করে তবে ভিন্ন নয় different
লরেন্স ডল

2
আমি এই আনসারটিকে পছন্দ করি কারণ এটি কৌশলগতভাবে সম্ভব বলে মনে হলেও এটি প্রযুক্তিগতভাবে কেন সম্ভব নয় তা ব্যাখ্যা করে।
লোপোবো

@ গুস্টাফসি, আমি মনে করি এটি একটি দুর্দান্ত ব্যাখ্যা ছিল। লরেন্স যেমন উল্লেখ করেছেন, ফু-র রেফারেন্সের কারণে এটি কেবলমাত্র ব্যর্থতা, যা স্থির নয়। তবে যদি আমি public static double sinDeg(double theta) { ... }একটি অভ্যন্তর গণিত ইউটিলিটি ক্লাস লিখতে চাই ?
এডওয়ার্ড ফালক

6

একমাত্র কারণ হ'ল "আবশ্যক নয়", তবে কেন এটি সমর্থন করার জন্য বিরক্ত করবেন?

কৃত্রিমভাবে, কোনও অভ্যন্তরীণ শ্রেণীর স্থির সদস্য থাকতে নিষেধ করার কোনও কারণ নেই। যদিও এর উদাহরণ Innerএকটি উদাহরণের সাথে সম্পর্কিত Outer, এটি এখনও Outer.Inner.myStaticএকটি স্থিতিশীল সদস্য রেফারেন্স ব্যবহার করা সম্ভবInner জাভা যদি সিদ্ধান্ত নেয় তবে ।

আপনার যদি সমস্ত দৃষ্টান্তগুলির মধ্যে কিছু ভাগ করে নেওয়া দরকার তবে আপনি Innerকেবল Outerএটিকে স্থির সদস্য হিসাবে রাখতে পারেন । এটি আপনার স্থিতিশীল সদস্যদের ব্যবহারের চেয়ে খারাপ নয় Inner, যেখানে Outerএখনও যে কোনও ব্যক্তিগত সদস্য অ্যাক্সেস Innerকরতে পারে (এনক্যাপসুলেশন উন্নত করে না)।

আপনার যদি কোনও Innerএকটি outerবস্তুর দ্বারা তৈরি করা সমস্ত দৃষ্টান্তগুলির মধ্যে কিছু ভাগ করে নেওয়া প্রয়োজন, তবে Outerসাধারণ সদস্য হিসাবে শ্রেণিতে রাখাই আরও বোধগম্য ।

"একটি স্ট্যাটিক নেস্টেড বর্গটি কেবলমাত্র একটি শীর্ষ স্তরের শ্রেণি" এই মতকে আমি সম্মত করি না। আমি মনে করি বাহ্যিক শ্রেণীর অংশ হিসাবে একটি স্থিত নেস্টেড শ্রেণি / অভ্যন্তরীণ শ্রেণিকে সত্যই বিবেচনা করা আরও ভাল কারণ তারা বাইরের শ্রেণীর ব্যক্তিগত সদস্যদের অ্যাক্সেস করতে পারে। এবং বহিরাগত শ্রেণীর সদস্যরা "অভ্যন্তরীণ শ্রেণীর সদস্য" পাশাপাশি। সুতরাং অভ্যন্তর শ্রেণিতে স্থির সদস্যকে সমর্থন করার প্রয়োজন নেই। বাইরের শ্রেণিতে একজন সাধারণ / স্থির সদস্যই যথেষ্ট ice


অভ্যন্তরীণ ক্লাসগুলি একটি "আবশ্যক" নয়। তবে ভাষাটি যেমন অভ্যন্তরীণ শ্রেণি সরবরাহ করে , তেমনি এগুলির একটি সম্পূর্ণ এবং অর্থপূর্ণ বাস্তবায়ন সরবরাহ করা উচিত।
ইন্ট্রিপিডিস

4

থেকে: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

উদাহরণস্বরূপ পদ্ধতি এবং ভেরিয়েবলগুলির মতো, একটি অভ্যন্তরীণ শ্রেণি তার বদ্ধ শ্রেণীর উদাহরণের সাথে সম্পর্কিত এবং সেই বস্তুর পদ্ধতি এবং ক্ষেত্রগুলিতে সরাসরি অ্যাক্সেস রয়েছে access এছাড়াও, কারণ কোনও অভ্যন্তর শ্রেণি একটি উদাহরণের সাথে সম্পর্কিত, এটি কোনও স্থির সদস্যকে নিজেই সংজ্ঞায়িত করতে পারে না।

ওরাকলের ব্যাখ্যাটি হ'ল স্তরের এবং হস্তবাহিত। যেহেতু কোনও অভ্যন্তরীণ শ্রেণীর মধ্যে স্থির সদস্যদের প্রিম্পট করার কোনও প্রযুক্তিগত বা সিনট্যাক্টিক কারণ নেই (এটি সি # এর মতো অন্যান্য ভাষায় অনুমোদিত) জাভা ডিজাইনারদের অনুপ্রেরণা সম্ভবত ধারণাগত স্বাদ এবং / বা প্রযুক্তিগত সুবিধার বিষয় ছিল।

এখানে আমার জল্পনা:

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

স্থির সদস্যদের প্রকৃতি (যা বস্তু-ভিত্তিক নয়) উদাহরণ-নির্ভরতার সাথে সংঘর্ষে লিপ্ত হয় অভ্যন্তরীণ শ্রেণির আত্মার (যা বস্তু-কেন্দ্রিক) কারণ আপনি বাইরের শ্রেণীর উদাহরণ ছাড়াই কোনও অভ্যন্তরীণ শ্রেণির স্থিতিশীল সদস্যকে কল করতে / ডাকতে পারেন by যোগ্য অভ্যন্তর শ্রেণীর নাম ব্যবহার করে।

বিশেষত স্ট্যাটিক ভেরিয়েবলগুলি অন্য কোনও উপায়ে আপত্তিজনক হতে পারে: বাইরের শ্রেণীর বিভিন্ন উদাহরণের সাথে যুক্ত একটি অভ্যন্তরীণ শ্রেণির দুটি উদাহরণ স্থিতিশীল ভেরিয়েবলগুলি ভাগ করতে পারে। যেহেতু ভেরিয়েবলগুলি রাষ্ট্রের একটি উপাদান, তাই অভ্যন্তরীণ দুটি শ্রেণীর উদাহরণগুলি বাস্তবে তাদের সাথে যুক্ত বাইরের শ্রেণীর উদাহরণগুলির সাথে স্বাধীনভাবে রাষ্ট্র ভাগ করে নেবে। স্থিতিশীল ভেরিয়েবলগুলি এইভাবে কাজ করে তা অগ্রহণযোগ্য নয় (আমরা ওওপি বিশুদ্ধতার সাথে এটি জাভায় সমঝোতা হিসাবে মেনে নিই) তবে অভ্যন্তরীণ শ্রেণিতে যার দ্বারা ইতিমধ্যে বহিরাগত শ্রেণীর উদাহরণগুলির সংমিশ্রণ রয়েছে তাদেরকে অনুমতি দিয়ে আরও গভীর অপরাধ করার পক্ষে যুক্তি রয়েছে there's নকশা করে. অন্তর্নিহিত আত্মার পক্ষে অভ্যন্তরীণ শ্রেণীর মধ্যে স্থিতিশীল সদস্যদের মজবুত করা এই গভীর OOP অপরাধকে ছড়িয়ে দেওয়ার অতিরিক্ত বোনাসকে কাটাচ্ছে।

অন্যদিকে, স্ট্যাটিক ধ্রুবক দ্বারা এ জাতীয় কোনও অপরাধ প্রেরণ করা হয়নি, যা অর্থপূর্ণভাবে রাষ্ট্র গঠন করে না এবং তাই এগুলি অনুমোদিত। উদাহরণ-নির্ভর চেতনার সাথে সর্বাধিক ধারাবাহিকতার জন্য স্থির ধ্রুবককে কেন নিষেধ করবেন না ? সম্ভবত কারণ স্থিরকারীদের প্রয়োজনের তুলনায় বেশি স্মৃতি গ্রহণের প্রয়োজন নেই (যদি তারা অস্থিতিশীল হতে বাধ্য হয় তবে তারা প্রতিটি অভ্যন্তরীণ শ্রেণিতে নকল করা হয় যা সম্ভাব্য অপব্যয়যোগ্য) waste অন্যথায় আমি ব্যতিক্রমের কারণটি কল্পনা করতে পারি না।

এটি শৈল-যুক্তিযুক্ত যুক্তি নাও হতে পারে তবে আইএমও বিষয়টি সম্পর্কে ওরাকলের কর্সার মন্তব্যটির সর্বাধিক অর্থ অনুধাবন করে।


3

সংক্ষিপ্ত উত্তর: বেশিরভাগ প্রোগ্রামারদের মানসিক মডেলটি কীভাবে স্কোপ কাজ করে তা জাভ্যাক দ্বারা ব্যবহৃত মডেল নয়। আরও স্বজ্ঞাত মডেলটির সাথে মিলে গেলে জাভাক কীভাবে কাজ করে তার একটি বড় পরিবর্তন প্রয়োজন।

অভ্যন্তরীণ ক্লাসে স্থির সদস্যদের কাঙ্ক্ষিত হওয়ার মূল কারণটি কোড পরিষ্কার-পরিচ্ছন্নতার জন্য - কেবলমাত্র কোনও অভ্যন্তরীণ শ্রেণীর দ্বারা ব্যবহৃত স্ট্যাটিক সদস্যকে বাইরের শ্রেণিতে স্থাপনের পরিবর্তে তার ভিতরে থাকতে হবে। বিবেচনা:

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 ------^

অন্য কথায়, অভ্যন্তরীণ শ্রেণিতে স্থির ঘোষণা এবং বাইরের শ্রেণিতে উদাহরণস্বরূপ ঘোষণাগুলি উভয়ই অভ্যন্তরীণ বর্গের উদাহরণ প্রসঙ্গে থাকে তবে এগুলির কোনওটিই অন্যটিতে বাস্তবে বাসা বাঁধে না; উভয় পরিবর্তে আউটরের স্থিতিশীল সুযোগে বাসা বাঁধে।

জাভাক কীভাবে কাজ করে তা ঠিক তা নয় - স্থির এবং দৃষ্টান্তের উভয় সদস্যের জন্য একক স্তরের সুযোগ রয়েছে এবং সর্বদা কঠোরভাবে বাসা বেঁধে থাকে। এমনকি উত্তরাধিকারগুলি সাবক্লাসে ঘোষণাগুলি অনুলিপি করে সুপারক্লাসের স্কোপ না করে প্রয়োগ করা হয়।

জাভাককে অভ্যন্তরীণ শ্রেণির স্থিতিশীল সদস্যদের সমর্থন করার জন্য হয় স্থিতিশীল এবং উদাহরণস্বরূপ স্কোপগুলি বিভক্ত করতে হবে এবং শাখা প্রশাখা এবং স্কোপ হায়ারারচিতে পুনরায় যোগদান করতে হবে, বা সমস্ত স্তরের প্রেক্ষাপটের ধরণটি ট্র্যাক করতে পরিবর্তনের জন্য এটি তার সাধারণ বুলিয়ান "স্থিতিশীল প্রসঙ্গ" ধারণাটি প্রসারিত করতে হবে বর্তমান সুযোগে নেস্টেড ক্লাসের।


আমি মনে করি যে অ-স্থিতিশীল অভ্যন্তর শ্রেণীর অ-ধ্রুবক স্থিতিশীল সদস্যদের মঞ্জুরি দেওয়ার সাথে আরও মৌলিক অসুবিধা হ'ল প্রোগ্রামাররা এই জাতীয় সদস্যদের ঘোষণা করে যে তাদের বহিরাগত শ্রেণীর উদাহরণের সাথে আবদ্ধ করার ইচ্ছা রয়েছে, বা সেগুলি সত্যই স্থির থাকতে পারে। যে কোনও ক্ষেত্রে যদি কোনও নির্মাণ - আইনী হলে - সংবেদনশীলভাবে দুটি পৃথক জিনিসের অর্থ হিসাবে নির্দিষ্ট করা যেতে পারে এবং যেখানে এই দুটি জিনিসই অন্য স্পষ্টভাবে প্রকাশ করা যেতে পারে, সেখানে উল্লেখ করা হয় যে নির্মাণটি অবৈধ বলে উল্লেখ করা তার চেয়ে প্রায়শই ভাল is হয় অর্থ আছে।
ক্যাট

3

কেন আমরা অ স্থিতিশীল অভ্যন্তর শ্রেণিতে স্থির পদ্ধতি রাখতে পারি না?

দ্রষ্টব্য: একটি অ-স্থিত নেস্টেড শ্রেণি অভ্যন্তর শ্রেণি হিসাবে পরিচিত তাই আপনার কাছে এটি নেই non-static inner class

অভ্যন্তরীণ শ্রেণীর উদাহরণটি বাইরের শ্রেণীর সাথে সম্পর্কিত উদাহরণ ছাড়া অস্তিত্ব রাখে না। একটি অভ্যন্তরীণ শ্রেণি স্থির সদস্যদের সংকলনের সময় স্থিরতা ব্যতীত অন্য কোন স্থির সদস্য ঘোষণা করতে পারে না। যদি এটি অনুমোদিত হয় তবে অর্থ সম্পর্কে অস্পষ্টতা থাকতে পারে static। সেক্ষেত্রে কিছু বিভ্রান্তি হত:

  1. এর অর্থ কি ভিএম-তে কেবল একটি উদাহরণ রয়েছে?
  2. বা বাইরের বস্তুতে কেবল একটি উদাহরণ?

এজন্য ডিজাইনাররা সম্ভবত এই সমস্যাটি একেবারেই না পরিচালনা করার সিদ্ধান্ত নিয়েছিলেন।

আমি যদি অভ্যন্তরীণ বর্গকে স্থির করে তুলি তবে এটি কাজ করে। কেন?

আবার আপনি কোনও অভ্যন্তর শ্রেণীর স্ট্যাটিক করতে পারবেন না বরং আপনি স্থির শ্রেণিকে নেস্টেড হিসাবে ঘোষণা করতে পারেন। সেক্ষেত্রে এই নেস্টেড ক্লাসটি আসলে বাইরের শ্রেণীর অংশ এবং কোনও সমস্যা ছাড়াই স্থির সদস্য থাকতে পারে।


3

এই বিষয়টি অনেকের দৃষ্টি আকর্ষণ করেছে, এখনও আমি সবচেয়ে সহজ শর্তে ব্যাখ্যা করার চেষ্টা করব।

প্রথমত, http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.4.1 রেফারেন্স সহ প্রথম শ্রেণি / ইন্টারফেস প্রথম উপস্থিতি / অনুরোধের অবিলম্বে শুরু করা হয় স্থায়ী কীওয়ার্ড দ্বারা পূর্বে যে কোনও সদস্যের।

  1. সুতরাং, আমরা যদি কোনও অভ্যন্তরীণ শ্রেণীর মধ্যে একটি স্থিতিশীল সদস্যের সাথে রাখি, তবে এটি অভ্যন্তরীণ শ্রেণির সূচনার দিকে পরিচালিত করবে, বহিরাগত / ঘেরযুক্ত শ্রেণিটি অগত্যা নয়। সুতরাং, আমরা শ্রেণি সূচনা ক্রম বাধাগ্রস্থ করি।

  2. এই বিষয়টিও বিবেচনা করুন যে একটি অ স্থিতিশীল অভ্যন্তর শ্রেণি একটি বদ্ধ / বহিরাগত শ্রেণীর উদাহরণের সাথে সম্পর্কিত। সুতরাং, একটি উদাহরণের সাথে সংযুক্তির অর্থ হ'ল অভ্যন্তরীণ শ্রেণি বাইরের শ্রেণীর উদাহরণের মধ্যে উপস্থিত থাকবে এবং উদাহরণগুলির মধ্যে পৃথক হবে।

বিন্দুটি সরলকরণের জন্য, স্থির সদস্যকে অ্যাক্সেস করার জন্য আমাদের একটি বহিরাগত শ্রেণির একটি উদাহরণ প্রয়োজন, যা থেকে আমাদের আবার অ স্থিতিশীল অভ্যন্তর শ্রেণীর উদাহরণ তৈরি করতে হবে। স্থির সদস্যদের উদাহরণগুলির জন্য আবদ্ধ হওয়ার কথা নয় এবং তাই আপনি একটি সংকলন ত্রুটি পান।


2

একটি অভ্যন্তর শ্রেণি স্থির নেস্টেড শ্রেণীর থেকে সম্পূর্ণ আলাদা কিছু যদিও উভয় বাক্য গঠনতে একই রকম। স্ট্যাটিক নেস্টেড ক্লাসগুলি গ্রুপিংয়ের জন্য কেবল একটি মাধ্যম যেখানে অভ্যন্তরীণ ক্লাসগুলির একটি দৃ association় সংযোগ রয়েছে - এবং তাদের বহিরাগত শ্রেণির সমস্ত মানগুলিতে অ্যাক্সেস। আপনি কেন একটি অভ্যন্তর শ্রেণি ব্যবহার করতে চান তা নিশ্চিত হওয়া উচিত এবং তারপরে এটি অবশ্যই প্রাকৃতিক হওয়া উচিত যা আপনার ব্যবহার করতে হবে। যদি আপনার কোনও স্থিতিশীল পদ্ধতি ঘোষণা করার দরকার হয় তবে এটি সম্ভবত একটি স্থির নেস্টেড বর্গ যা আপনি যেভাবে চান।


বেনেডিক্ট, আপনি যখন বলছেন "স্থির নেস্টেড ক্লাসগুলি কেবল গ্রুপিংয়ের উপায়"?
অঙ্কুর

0

ধরুন বাহ্যিক শ্রেণীর দুটি উদাহরণ রয়েছে এবং তারা উভয়ই অভ্যন্তরীণ শ্রেণিকে ইনস্ট্যান্ট করেছে ow এখন যদি অভ্যন্তরীণ শ্রেণীর একটি স্থিতিশীল সদস্য থাকে তবে এটি সেই সদস্যের কেবল একটি অনুলিপিটি heগল অঞ্চলে রাখবে this এক্ষেত্রে বহিরাগত শ্রেণীর উভয় বস্তুই এটি উল্লেখ করবে একক অনুলিপি এবং তারা এটি একসাথে পরিবর্তন করতে পারে his এই কারণে এই জাভা এই বিধিনিষেধ প্রয়োগ করেছে তাই "ডার্টি রিড" পরিস্থিতি তৈরি করতে পারে this এই যুক্তি সমর্থন করার পক্ষে অন্য একটি শক্ত বক্তব্যটি জাভা এখানে চূড়ান্ত স্থির সদস্যদের অনুমতি দেয়, যাদের মানগুলি হতে পারে না তারা বাইরের শ্রেণীর অবজেক্টের যে কোনও একটি থেকে পরিবর্তিত হয়েছে। আমি ভুল হলে দয়া করে আমাকে দিন।


0

সবার আগে কেন কেউ অ স্থিতিশীল অভ্যন্তর শ্রেণিতে স্থির সদস্যকে সংজ্ঞায়িত করতে চান? উত্তরটি হ'ল, যাতে বাইরের শ্রেণীর সদস্যরা সেই স্থির সদস্যকে কেবলমাত্র অভ্যন্তরীণ শ্রেণির নাম সহ ব্যবহার করতে পারে, তাই না?

তবে এই ক্ষেত্রে আমরা সরাসরি বাহ্যিক শ্রেণিতে সদস্যকে সংজ্ঞায়িত করতে পারি। যা বাইরের শ্রেণীর উদাহরণের মধ্যে অভ্যন্তরীণ শ্রেণীর সমস্ত বস্তুর সাথে যুক্ত হবে।

নীচের কোড মত,

public class Outer {

  class Inner {

    public static void method() {

    }

  }

}

এইভাবে লেখা যেতে পারে

public class Outer {

  void method() {

   }

   class Inner {


  }

}

সুতরাং আমার মতে কোডটি জটিল না করার জন্য জাভা ডিজাইনার এই কার্যকারিতাটি মঞ্জুরি দিচ্ছেন না বা আমরা আরও কিছু বৈশিষ্ট্য সহ ভবিষ্যতে প্রকাশে এই কার্যকারিতাটি দেখতে পাচ্ছি।


0

ক্লাসটিকে একটি সাধারণ ক্ষেত্র হিসাবে বিবেচনা করার চেষ্টা করুন, তবে আপনি বুঝতে পারবেন।

//something must be static. Suppose something is an inner class, then it has static keyword which means it's a static class
Outer.something 

-1

স্থিতিশীল হিসাবে অভ্যন্তরীণ শ্রেণীর সদস্যদের রাখা অযথা কারণ আপনি তাদের প্রথম স্থানে অ্যাক্সেস করতে পারবেন না।

আপনি ক্লাসনেম.এমবারনেম ব্যবহার করেন এমন একটি স্ট্যাটিক সদস্য অ্যাক্সেস করার জন্য এটি সম্পর্কে চিন্তা করুন, আমাদের ক্ষেত্রে এটি বাইরেরক্ল্যাশনেম.ইন.এনইনারক্লাসনাম.মেমবারনাম এর মতো কিছু হওয়া উচিত, এখন আপনি দেখতে পাচ্ছেন কেন অভ্যন্তর শ্রেণি স্থির থাকতে হবে ....


-2

স্থির নেস্টেড ক্লাসগুলিতে আপনাকে স্ট্যাটিক পদ্ধতিগুলি অনুমোদিত। উদাহরণ স্বরূপ

public class Outer {

  public static class Inner {

    public static void method() {

    }
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.