জাভা কেন অভ্যন্তর শ্রেণিতে স্থির ক্ষেত্রগুলিকে নিষিদ্ধ করে?


85
class OuterClass {
 class InnerClass {
  static int i = 100; // compile error
  static void f() { } // compile error
 }
} 

যদিও এটি দিয়ে স্থির ক্ষেত্রটি অ্যাক্সেস করা সম্ভব নয় OuterClass.InnerClass.i, যদি আমি স্থির হওয়া উচিত এমন কোনও কিছু রেকর্ড করতে চাই, যেমন ইনারক্লাস অবজেক্টের সংখ্যা তৈরি করা হয় তবে ক্ষেত্রটি স্থিতিশীল করতে সহায়ক হবে। তাহলে জাভা কেন অভ্যন্তর শ্রেণিতে স্থির ক্ষেত্র / পদ্ধতি নিষিদ্ধ করে?

সম্পাদনা: আমি স্থির নেস্টেড ক্লাস (বা স্থিতিশীল অভ্যন্তর শ্রেণি) দিয়ে সংকলককে কীভাবে আনন্দিত করতে জানি, তবে আমি যা জানতে চাই তা কেন জাভা ভাষা নকশা এবং উভয় থেকেই অভ্যন্তরীণ শ্রেণির অভ্যন্তরীণ শ্রেণির (বা সাধারণ অভ্যন্তরীণ শ্রেণি) স্থির ক্ষেত্রগুলি / পদ্ধতিগুলি নিষিদ্ধ করে why বাস্তবায়নের দিকগুলি, যদি কেউ এ সম্পর্কে আরও জানেন।


4
আমার প্রিয় উদাহরণটি কেবলমাত্র অভ্যন্তর শ্রেণীর জন্য লগার রাখা। অন্যান্য সমস্ত লগারদের মতো এটি স্থিতিশীল হতে পারে না।
পাইটর ফাইন্ডেন

জাভা 16 যেহেতু এখন আর কেস নেই - এই উত্তরটি দেখুন
নিকোলাই পার্লগ

উত্তর:


32

অভ্যন্তর শ্রেণীর পিছনে ধারণাটি বদ্ধ দৃষ্টান্তের প্রসঙ্গে কাজ করা। কোনওভাবে, স্থিতিশীল ভেরিয়েবল এবং পদ্ধতিগুলিকে এই অনুপ্রেরণার বিরোধিতা করে?

৮.১.২ অভ্যন্তরীণ ক্লাস এবং সংযুক্তকরণের উদাহরণ

একটি অভ্যন্তর শ্রেণি হল একটি নেস্টেড বর্গ যা স্পষ্টভাবে বা স্পষ্টভাবে স্থির হিসাবে ঘোষণা করা হয় না। অভ্যন্তরীণ ক্লাসগুলি স্ট্যাটিক ইনিশিয়ালাইজার (§8.7) বা সদস্য ইন্টারফেস ঘোষণা করতে পারে না। অভ্যন্তরীণ ক্লাসগুলি স্থির সদস্যদের ঘোষণা করতে পারে না, যদি না তারা সংকলন-সময় ধ্রুবক ক্ষেত্র (§15.28) হয়।


19
হয়তো এটা শুধু সিদ্ধান্ত নিয়েছে যে ভালো
গ্রেগরী Pakosz

4
আপনি পিতামাতাল রেফারেন্স ব্যতীত অ স্থিতিশীল অভ্যন্তরটি ইনস্ট্যান্ট করতে পারবেন না , তবে আপনি এটি এখনও শুরু করতে পারেন ।
স্কাফম্যান 16

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

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

জাভা 16 যেহেতু এখন আর কেস নেই - এই উত্তরটি দেখুন
নিকোলাই পার্লগ

56

আমি যা জানতে চাই তা কেন জাভা অভ্যন্তরীণ শ্রেণীর অভ্যন্তরে স্থির ক্ষেত্র / পদ্ধতি নিষিদ্ধ করে

কারণ সেই অভ্যন্তর শ্রেণিগুলি "উদাহরণ" অভ্যন্তর শ্রেণি। এটি হ'ল এগুলি এনকোলেজিং অবজেক্টের একটি উদাহরণ বৈশিষ্ট্যের মতো।

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

এটি একই রকম আপনি একই সাথে একটি স্থিতিশীল / উদাহরণ বৈশিষ্ট্য তৈরি করার চেষ্টা করেছিলেন।

নিম্নলিখিত উদাহরণটি ধরুন:

class Employee {
    public String name;
}

আপনি যদি কর্মচারীর দুটি উদাহরণ তৈরি করেন:

Employee a = new Employee(); 
a.name = "Oscar";

Employee b = new Employee();
b.name = "jcyang";

এটি স্পষ্ট যে কেন প্রত্যেকটির সম্পত্তির জন্য নিজস্ব মূল্য আছে name, তাই না?

অন্তর্গত শ্রেণীর ক্ষেত্রেও একই ঘটনা ঘটে; প্রতিটি অভ্যন্তর শ্রেণীর উদাহরণ অন্যান্য অভ্যন্তর শ্রেণীর উদাহরণগুলির চেয়ে স্বতন্ত্র।

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

class Employee {
    public String name;
    class InnerData {
        static count; // ??? count of which ? a or b? 
     }
}

আপনি যখন উদাহরণটি তৈরি করেন aএবং bউপরের উদাহরণে, স্ট্যাটিক ভেরিয়েবলের সঠিক মূল্য কী হবে count? এটি নির্ধারণ করা সম্ভব নয়, কারণ InnerDataশ্রেণীর অস্তিত্ব সম্পূর্ণভাবে প্রতিটি ঘেরযুক্ত বস্তুর উপর নির্ভর করে।

এই কারণেই, যখন শ্রেণিটি ঘোষিত হয় static, নিজেকে বাঁচার জন্য এটি আর জীবন্ত উদাহরণের প্রয়োজন হয় না। এখন যেহেতু কোনও নির্ভরতা নেই, আপনি নির্দ্বিধায় স্থিত বৈশিষ্ট্যটি ঘোষণা করতে পারেন।

আমি মনে করি এটি পুনরাবৃত্তিজনক মনে হয় তবে আপনি উদাহরণ বনাম শ্রেণীর বৈশিষ্ট্যগুলির মধ্যে পার্থক্য সম্পর্কে চিন্তাভাবনা করলে তা কার্যকর হবে।


4
আমি আপনার ব্যাখ্যাটি অভ্যন্তর শ্রেণীর স্থির বৈশিষ্ট্যের জন্য কিনব, তবে @ স্কাফম্যান আমার উত্তরের মন্তব্যে উল্লেখ করেছেন, স্থির পদ্ধতি সম্পর্কে কী ? দেখে মনে হচ্ছে যেন কোনও আদেশ ছাড়াই পদ্ধতিগুলির অনুমতি দেওয়া উচিত they প্রকৃতপক্ষে, জাভাতে, আপনি উদাহরণগুলিতে স্থির পদ্ধতিগুলি কল করতে পারেন (যদিও এটি খারাপ শৈলী হিসাবে বিবেচিত)। BTW: আমি যেমন C # এর ওপি এর কোড কম্পাইল করার চেষ্টা করার জন্য একটি সহকর্মী জিজ্ঞাসা এবং এটা করে সঙ্কলন। সুতরাং সি # স্পষ্টতই এটির অনুমতি দেয় যা প্রমাণ করে যে ওপি যা করতে চায় তা কিছু মৌলিক ওও নীতি লঙ্ঘন করে না।
আসফ 18

4
পদ্ধতিগুলির সাথে ঠিক একই রকম হয়। এখানে বিন্দুটি বৈশিষ্ট্য বা পদ্ধতিগুলি স্ট্যাটিস বা না হওয়া নয়, তবে অভ্যন্তরীণ শ্রেণীর পক্ষে এটি "স্টাফ" উদাহরণ । আমি বোঝাতে চাইছি এখানে সমস্যাটি হ'ল বাইরের শ্রেণি তৈরি না হওয়া পর্যন্ত এই জাতীয় অভ্যন্তর শ্রেণির উদাহরণ উপস্থিত নেই। অতএব কোন পদ্ধতি না থাকলে পাঠানো হবে there আপনি কেবল বাতাসকে আঘাত করবেন কারণ আপনার প্রথম অবস্থানে একটি উদাহরণ প্রয়োজন need
অস্কারআয়েজ

4
সি # সম্পর্কে ... ভাল। এটি ওও বৈধ নয় কেবল সি # এটির অনুমতি দেয় বলে আমি বোঝাতে চাইছি না এটি ভুল, তবে সি # এর ধারাবাহিকতা ব্যয় করেও উন্নয়নকে আরও সহজ করার জন্য কয়েকটি দৃষ্টান্ত অন্তর্ভুক্ত করা হয়েছে (প্রতিটি। নেট প্রকাশের সাথে আপনাকে নতুন জিনিস শিখতে হবে) এবং এটি এটি এবং অন্যদের মধ্যে অন্যান্য ধরণের জিনিসকে অনুমতি দেয়। আমি মনে করি এটি একটি ভাল জিনিস। যদি সম্প্রদায়টি অতিরিক্ত বৈশিষ্ট্যটি অনুভব করে তবে যথেষ্ট পরিমাণে সি # এটি ভবিষ্যতে থাকতে পারে।
অস্কাররাজ

4
@ অস্কার রাইজ আপনার স্থিতিশীল পদ্ধতি / ক্ষেত্রগুলি ব্যবহার করার জন্য কেন অভ্যন্তর শ্রেণীর উদাহরণ প্রয়োজন ? এবং অভ্যন্তরীণ শ্রেণিতে স্থিত পদ্ধতির [দরকারী] উদাহরণ হ'ল ব্যক্তিগত সহায়ক পদ্ধতি।
লিওনিড সেমিওনভ

4
ব্যবহারের সঙ্গে finalস্ট্যাটিক ক্ষেত্র জাভা ভেতরের ক্লাসে অনুমোদিত হয়। আপনি এই পরিস্থিতিটি কীভাবে ব্যাখ্যা করবেন?
945

34

InnerClassstaticসদস্য থাকতে পারে না কারণ এটি একটি উদাহরণ (এর OuterClass) এর সাথে সম্পর্কিত। আপনার কি ডিক্লেয়ার তাহলে InnerClassযেমন staticউদাহরণ হিসেবে বলা যায় থেকে এটা বিচ্ছিন্ন করুন, আপনার কোড কম্পাইল করতে হবে।

class OuterClass {
    static class InnerClass {
        static int i = 100; // no compile error
        static void f() { } // no compile error
    }
}

বিটিডাব্লু: আপনি এখনও এর উদাহরণ তৈরি করতে সক্ষম হবেন InnerClassstaticএই প্রসঙ্গে একটি সংলগ্ন উদাহরণ ছাড়া ঘটতে দেয় OuterClass


6
InnerClassনেই না অন্তর্গত OuterClass, দৃষ্টান্ত এটি না। দুই শ্রেণির নিজেদের মধ্যে তেমন কোনও সম্পর্ক নেই। আপনার স্থির পদ্ধতি স্থির থাকতে পারে না কেন সে প্রশ্ন InnerClass
স্কাফম্যান

10

প্রকৃতপক্ষে, আপনি স্থির ক্ষেত্রগুলি ঘোষণা করতে পারেন যদি সেগুলি ধ্রুবক হয় এবং সংকলন সময়ে লেখা হয়।

class OuterClass {
    void foo() {
        class Inner{
            static final int a = 5; // fine
            static final String s = "hello"; // fine
            static final Object o = new Object(); // compile error, because cannot be written during compilation
        }
    }
}

8
  1. ক্লাস ইনিশিয়ালাইজেশন ক্রম একটি জটিল কারণ।

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

  • টি দ্বারা ঘোষিত একটি স্ট্যাটিক ক্ষেত্র ব্যবহৃত হয় এবং ক্ষেত্রটি ধ্রুবক পরিবর্তনশীল নয়।

সুতরাং যদি অভ্যন্তরীণ বর্গের একটি স্থিতিশীল ক্ষেত্র অ্যাক্সেস থাকে যা অভ্যন্তরীণ বর্গকে আরম্ভ করার কারণ করে, তবে এটি নিশ্চিত করে না যে বদ্ধ শ্রেণিটি আরম্ভ করা হয়েছে।

  1. এটি কিছু প্রাথমিক নিয়ম লঙ্ঘন করবেনুব স্টাফ এড়ানোর জন্য আপনি শেষ বিভাগে (থেকে two cases) এ যেতে পারেন

একটা জিনিষ সম্পর্কে কিছু যখন হয় এটা শুধু প্রতি উপায় একটি স্বাভাবিক বর্গ মত আচরণ হবে এবং এটি বাইরের বর্গ সঙ্গে সংশ্লিষ্ট।static nested classnested classstatic

তবে Inner class/ এর ধারণাটি বাইরের / ঘেরের শ্রেণীর সাথে যুক্ত হবে be ক্লাস নয় উদাহরণের সাথে জড়িত নোট করুন । এখন উদাহরণের সাথে যুক্ত হওয়ার অর্থ পরিষ্কারভাবে বোঝা যাচ্ছে যে ( উদাহরণ পরিবর্তনশীলের ধারণা থেকে ) এটি একটি উদাহরণের অভ্যন্তরে উপস্থিত থাকবে এবং উদাহরণগুলির মধ্যে পৃথক হবে। non-static nested classinstance

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

সুতরাং যদি জাভা আমাদের স্ট্যাটিক ভেরিয়েবল স্ট্যাটিক নেস্টেড ক্লাসের ভিতরে ব্যবহারের অনুমতি দেয়। সেখানে থাকবে দুটি মামলা

  • যদি এটি অভ্যন্তর শ্রেণীর সমস্ত উদাহরণের সাথে ভাগ করা হয় তবে এটি context of instance(উদাহরণ পরিবর্তনশীল) এর ধারণা লঙ্ঘন করবে । এটি তখন কোনও হয় না।
  • যদি এটি সমস্ত দৃষ্টান্তের সাথে ভাগ না করা হয় তবে এটি স্থির হওয়ার ধারণাকে লঙ্ঘন করবে। আবার না।

5

এই "সীমাবদ্ধতার" জন্য আমি সবচেয়ে উপযুক্ত অনুপ্রেরণাটি এখানে: আপনি বাইরের বস্তুর উদাহরণ ক্ষেত্র হিসাবে কোনও অভ্যন্তরীণ শ্রেণির স্থির ক্ষেত্রের আচরণটি বাস্তবায়ন করতে পারেন; আপনি এখন প্রয়োজন হবে না স্ট্যাটিক ক্ষেত্র / পদ্ধতি । আমার বোঝার আচরণটি হ'ল কিছু বস্তুর সমস্ত অভ্যন্তর শ্রেণীর দৃষ্টান্তগুলি একটি ক্ষেত্র (বা পদ্ধতি) ভাগ করে।

সুতরাং, ধরুন আপনি অভ্যন্তরীণ শ্রেণীর সমস্ত উদাহরণ গণনা করতে চেয়েছিলেন, আপনি যা করবেন:

public class Outer{
    int nofInner; //this will count the inner class 
                  //instances of this (Outer)object
                  //(you know, they "belong" to an object)
    static int totalNofInner; //this will count all 
                              //inner class instances of all Outer objects
    class Inner {
        public Inner(){
            nofInner++;
            totalNofInner++;
        }
    }
}

4
তবে প্রশ্ন হ'ল স্থির ক্ষেত্রগুলি যখন ঘোষণা করা হয় তখন তাদের অনুমতি দেওয়ার কারণ কী final?
স্নেহ

যদি আপনি [ স্ট্যাকওভারফ্লো.com/a/1954119/1532220 ] দেখুন (উপরের অস্কাররাইজ উত্তর): তার অনুপ্রেরণা হ'ল কোনও মান ভেরিয়েবলের সাথে যুক্ত হতে পারে না। অবশ্যই, যদি ভেরিয়েবলটি চূড়ান্ত হয় তবে আপনি সহজেই জানতে পারবেন কোন মানটি নির্ধারণ করা উচিত (আপনার অবশ্যই তা জেনে থাকতে হবে)।
আইয়ানস

2

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

দ্রষ্টব্য: অভ্যন্তরীণ ক্লাসগুলি সর্বদা বহিরাগত শ্রেণীর জন্য চলকের মতো আচরণ করুন তারা অন্য ভেরিয়েবলগুলির মতো স্থির বা অ-স্থির হতে পারে।


তবে অভ্যন্তর শ্রেণীর static finalধ্রুবক থাকতে পারে ।
বৃষ্টি


1

কারণ এটি "স্ট্যাটিক" এর অর্থের মধ্যে দ্ব্যর্থহীনতা সৃষ্টি করবে।

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

কে এস হোর্স্টম্যান দ্বারা পরিচালিত "অধীরের জন্য কোর জাভা এসই 9" থেকে নেওয়া। পৃষ্ঠা 90 অধ্যায় 2.6.3


0

জাভা 16 এর পরে, এটি আর হয় না। জেইপি 395 থেকে উদ্ধৃতি (রেকর্ড চূড়ান্ত করার ক্ষেত্রে):

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

প্রকৃতপক্ষে, নিম্নলিখিত কোডটি জাভা 16 (16.ea.27 দিয়ে চেষ্টা করা) এর সাথে সংকলিত হতে পারে:

public class NestingClasses {

    public class NestedClass {

        static final String CONSTANT = new String(
                "DOES NOT COMPILE WITH JAVA <16");

        static String constant() {
            return CONSTANT;
        }

    }

}

-1

আমার ধারণা এটি ধারাবাহিকতার জন্য। যদিও এর জন্য কোনও প্রযুক্তিগত সীমাবদ্ধতা রয়েছে বলে মনে হচ্ছে না, আপনি বাইরে থেকে অভ্যন্তরীণ শ্রেণীর স্থির সদস্যদের অ্যাক্সেস করতে পারবেন না, OuterClass.InnerClass.iকারণ মধ্যম পদক্ষেপটি অচল নয়।


তবে অভ্যন্তর শ্রেণীর static finalধ্রুবক থাকতে পারে ।
বৃষ্টি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.