জাভাতে স্ট্যাটিক নেস্টেড ক্লাস কেন?


217

আমি জাভা কোডটির দিকে চেয়ে ছিলাম LinkedListএবং লক্ষ্য করেছি যে এটি একটি স্ট্যাটিক নেস্টেড ক্লাস ব্যবহার করেছে Entry,।

public class LinkedList<E> ... {
...

 private static class Entry<E> { ... }

}

সাধারণ অভ্যন্তর শ্রেণীর চেয়ে স্থির নেস্টেড ক্লাসটি ব্যবহার করার কারণ কী?

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

তবে আমি ভেবেছিলাম অন্যান্য কারণও থাকতে পারে, সম্ভবত পারফরম্যান্স। এটা কি হতে পারে?

বিঃদ্রঃ. আমি আশা করি আমার শর্তগুলি সঠিক হয়ে গেছে, আমি এটিকে একটি স্থিতিশীল অভ্যন্তর শ্রেণি বলতাম, তবে আমি মনে করি এটি ভুল: http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html


উত্তর:


271

আপনি যে সূর্যের পৃষ্ঠায় লিঙ্ক করেছেন তার দুটির মধ্যে কিছু মূল পার্থক্য রয়েছে:

নেস্টেড বর্গ তার সংলগ্ন শ্রেণীর সদস্য is অ-স্থির নেস্টেড ক্লাসগুলি (অভ্যন্তরীণ ক্লাসগুলি) প্রাইভেট হিসাবে ঘোষিত হলেও, ঘেরের ক্লাসের অন্যান্য সদস্যদের অ্যাক্সেস রয়েছে। স্থির নেস্টেড ক্লাসগুলির ঘেরের ক্লাসের অন্যান্য সদস্যদের অ্যাক্সেস নেই।
...

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

LinkedList.Entryএটি কেবলমাত্র ব্যবহার করে শীর্ষ-স্তরের শ্রেণি হওয়ার দরকার নেই LinkedList(কিছু অন্যান্য ইন্টারফেস রয়েছে যার নাম স্থির নেস্টেড ক্লাস রয়েছে Entry, যেমন Map.Entry- একই ধারণা)। এবং যেহেতু এটি লিংকডলিস্টের সদস্যদের অ্যাক্সেসের প্রয়োজন নেই, তাই এটি স্থির হওয়ার জন্য এটি বোঝায় - এটি একটি অনেক পরিচ্ছন্ন পদ্ধতির।

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


বাহ, আমি মন্তব্য করার জন্য কোনও অ্যাঙ্কর লিঙ্ক পাচ্ছি বলে মনে হয় না , তবে এটির এই মন্তব্য:#comment113712_253507
জ্যাচ লিসোবেই

1
@ ম্যাট বি বি যদি কোনও স্থির নেস্টেড বর্গের আউটার ক্লাসের উদাহরণ সদস্যদের অ্যাক্সেস না থাকে তবে এটি আউটার শ্রেণির উদাহরণ সদস্যদের সাথে কীভাবে যোগাযোগ করবে?
গিপ

1
@ ম্যাটটিবি তবে কীভাবে @ গীক লক্ষ্য করেছেন, সান পৃষ্ঠাটি পরস্পরবিরোধী: A static nested class interacts with the instance members of its outer class (and other classes) just like any other top-level class ডক্সের আগে কেবল একটি অনুচ্ছেদে যদি বলা যায় যে: Static nested classes do not have access to other members of the enclosing class সম্ভবত তারা বলতে A nested (non-static) class interacts with the instance members of its outer class (and other classes) just like any other top-level class
চাইবে

1
@ ডেভিডস লিঙ্কটির জন্য ধন্যবাদ! হ্যাঁ, আমি ভুল ছিলাম, এখন আমার মন্তব্য পড়তে দেখছি আমার রেপ্রেসটি ভুল ছিল। হিসাবে আপনি বলেন: An inner class interacts with the instance members through an implicit reference to its enclosing classএবং আরেকটি আকর্ষণীয় সম্পত্তি এই পয়েন্ট non-static inner classesভাল হিসাবে হিসাবে anonymous inner classesবা local classes defined inside a blockতারা সব থাকতে পারে না একটি no-argকারণ কন্সট্রাকটর কম্পাইলার পরোক্ষভাবে অনুক্রমে প্রত্যেক কন্সট্রাকটর এর ARG ক্রম পূর্বে লিখুন করবে এনক্লোজিং একটি দৃষ্টান্ত একটি রেফারেন্স পাস বর্গ। বেশ সহজ.
টোনিক্স

1
আপনি কেবল প্রাইভেট কনস্ট্রাক্টরযুক্ত বহিরাগত ক্লাসটি ইনস্ট্যান্ট করতে স্ট্যাটিক ইনার ক্লাস ব্যবহার করতে পারেন। এটি বিল্ডার প্যাটার্নে ব্যবহৃত হয়। আপনি অভ্যন্তর শ্রেণীর সাথে একই কাজ করতে পারবেন না।
সিমিমুরুগান

47

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

মনে মনে, আমি সি # ফ্যান হিসাবে পক্ষপাতদুষ্ট - সি # এর অভ্যন্তরীণ শ্রেণীর সমতুল্য নয়, যদিও এটিতে নেস্টেড ধরণের রয়েছে। আমি বলতে পারি না আমি এখনও অভ্যন্তরীণ ক্লাস মিস করেছি :)


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

হ্যাঁ, কলিনের ডান - সি # এর অভ্যন্তরীণ ক্লাস নেই, এতে নেস্ট ক্লাস রয়েছে। মনে মনে, সি # তে একটি স্ট্যাটিক নেস্টেড ক্লাস জাভাতে স্থির নেস্টেড ক্লাসের মতো নয় :)
জন স্কিটি

2
নেস্টেড টাইপগুলি সেই জায়গাগুলির মধ্যে একটি যেখানে জাভার তুলনায় সি # এটি অত্যন্ত সঠিক পেয়েছে। আমি এর
অভিব্যক্তিপূর্ণ

3
@ নওফাল: হ্যাঁ, সি # ভাষাটি কতটা ভালভাবে ডিজাইন করা হয়েছে (এবং নির্দিষ্ট করা হয়েছে) তা দেখে আমি কয়েকটি স্তম্ভকে অবাক করে দিয়েছি।
জন স্কিটি

1
@ জোনস্কিট এই নিগলগুলি কী সে সম্পর্কে আপনার কোনও নিবন্ধ বা ব্লগ আছে? আমি আপনাকে "niggles" :) যেমন তা খুঁজে পুরনো যেতে চাই
nawfal

27

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


যদি 'বাহ্যিক' শ্রেণি চূড়ান্ত হয় এবং তাই একেবারেই ইনস্ট্যান্ট করা যায় না, এই যুক্তি কি সে ক্ষেত্রে অর্থবোধ করে? কারণ এটি বহিরাগত শ্রেণীর একটি রেফারেন্স রাখা / অকার্যকর, যদি দ্বিতীয়টি চূড়ান্ত হয়।
getadzeg

10

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

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


8

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

class OuterClass {
    private OuterClass(int x) {
        System.out.println("x: " + x);
    }

    static class InnerClass {
        public static void test() {
            OuterClass outer = new OuterClass(1);
        }
    }
}

public class Test {
    public static void main(String[] args) {
        OuterClass.InnerClass.test();
        // OuterClass outer = new OuterClass(1); // It is not possible to create outer instance from outside.
    }
}

এটি আউটপুট এক্স: 1 হবে


7

স্ট্যাটিক নেস্টেড ক্লাসটি অন্য বাইরের শ্রেণীর মতোই, যেমন বাইরের শ্রেণীর সদস্যদের অ্যাক্সেস নেই।

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

এই জাতীয় ব্যবহারের উদাহরণ, আপনি অ্যান্ড্রয়েড আর.জাভা (সংস্থানসমূহ) ফাইলে খুঁজে পেতে পারেন। অ্যান্ড্রয়েডের রেজ ফোল্ডারে লেআউট (স্ক্রিন ডিজাইনযুক্ত), অঙ্কনযোগ্য ফোল্ডার (প্রকল্পের জন্য ব্যবহৃত চিত্রগুলি), মান ফোল্ডার (এতে স্ট্রিং ধ্রুবক রয়েছে) ইত্যাদি রয়েছে contains

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

এখানে অ্যান্ড্রয়েডে উত্পাদিত আর জাভা ফাইলটির চেহারা ও অনুভূতিটি এখানে : তারা কেবল প্যাকেজিং সুবিধার্থে ব্যবহার করছে।

/* AUTO-GENERATED FILE.  DO NOT MODIFY.
 *
 * This class was automatically generated by the
 * aapt tool from the resource data it found.  It
 * should not be modified by hand.
 */

package com.techpalle.b17_testthird;

public final class R {
    public static final class drawable {
        public static final int ic_launcher=0x7f020000;
    }
    public static final class layout {
        public static final int activity_main=0x7f030000;
    }
    public static final class menu {
        public static final int main=0x7f070000;
    }
    public static final class string {
        public static final int action_settings=0x7f050001;
        public static final int app_name=0x7f050000;
        public static final int hello_world=0x7f050002;
    }
}

6

HTTP থেকে :

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


4

সাধারণ উদাহরণ:

package test;

public class UpperClass {
public static class StaticInnerClass {}

public class InnerClass {}

public static void main(String[] args) {
    // works
    StaticInnerClass stat = new StaticInnerClass();
    // doesn't compile
    InnerClass inner = new InnerClass();
}
}

অ-স্থির হলে শ্রেণিটি উচ্চ শ্রেণির উদাহরণে সন্ধান করা যায় না (সুতরাং উদাহরণটি যেখানে মূল স্থিতিশীল ফাংশন নয়)


আপনার স্ট্যাটিকআইনারক্লাস আসলে স্ট্যাটিক নেস্টেড / ইনার ক্লাস নয়। এটি একটি শীর্ষ স্তরের স্থিতিশীল শ্রেণি।
দ্য রাইলি

2

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

PS: আমি সর্বদা 'নেস্টেড' এবং 'অভ্যন্তরীণ' কে বিনিময়যোগ্য হতে বুঝতে পেরেছি। পদগুলিতে সূক্ষ্ম সূক্ষ্মতা থাকতে পারে তবে বেশিরভাগ জাভা বিকাশকারীরা তা বুঝতে পারেন।


1

স্থিতিশীল অভ্যন্তরীণ শ্রেণীর ফলে মেমরি ফাঁস হতে পারে এবং স্থির অভ্যন্তর শ্রেণি তাদের বিরুদ্ধে সুরক্ষা দেয়। যদি বাইরের শ্রেণিটিতে যথেষ্ট পরিমাণে ডেটা থাকে তবে এটি অ্যাপ্লিকেশনটির কার্যকারিতা হ্রাস করতে পারে।


'স্ট্যাটিক ইনার' শর্তে একটি বিপরীত।
লার্নের মারকুইস

1
@ এজেপি, শীশ ... লোকেরা যে কোনও সময় "স্থিতিশীল অভ্যন্তর শ্রেণি" উল্লেখ করার সময় এটিকে নির্দেশ করে সত্যই
মুক্তি পেয়েছে

0

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

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


একটি সহজাত শ্রেণি 'বদ্ধ শ্রেণীর উদাহরণের অংশ' নয়।
লার্নের মারকুইস

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

0

স্থিতিশীল না হয়ে স্থির নেস্টেড ক্লাস ব্যবহার করা কিছু ক্ষেত্রে ফাঁকা জায়গা বাঁচাতে পারে। উদাহরণস্বরূপ: Comparatorক্লাসের অভ্যন্তরে একটি প্রয়োগ করা , শিক্ষার্থী বলুন।

public class Student {
  public static final Comparator<Student> BY_NAME = new ByName();
  private final String name;
  ...
  private static class ByName implements Comparator<Student> {
    public int compare() {...}
  }
}

তারপরে staticনিশ্চিত করা হয় যে প্রতি ক্লাসে নতুন শিক্ষার্থীর উদাহরণ তৈরি হওয়ার পরিবর্তে শিক্ষার্থী শ্রেণীর কেবলমাত্র একজন তুলনামূলক রয়েছে।


-1

অভ্যন্তর শ্রেণীর অসুবিধা -

  1. এক সময় ব্যবহার
  2. সমর্থন এবং এনক্যাপসুলেশন উন্নত
  3. readibility
  4. ব্যক্তিগত ক্ষেত্র অ্যাক্সেস

বাইরের শ্রেণীর উপস্থিতি না থাকলে অভ্যন্তর শ্রেণীর অস্তিত্ব থাকবে না।

class car{
    class wheel{

    }
}

চার ধরণের অভ্যন্তর শ্রেণি রয়েছে।

  1. সাধারণ অভ্যন্তরীণ বর্গ
  2. পদ্ধতি স্থানীয় অভ্যন্তর শ্রেণি
  3. নামবিহীন অভ্যন্তর শ্রেণি
  4. স্থির অভ্যন্তর শ্রেণি

বিন্দু ---

  1. স্থির অভ্যন্তর শ্রেণি থেকে, আমরা কেবল বহিরাগত শ্রেণির স্থির সদস্য অ্যাক্সেস করতে পারি।
  2. অভ্যন্তর শ্রেণীর অভ্যন্তরে আমরা স্ট্যাটিক সদস্য ঘোষণা করতে পারি না an
  3. বহিরাগত শ্রেণির স্থির ক্ষেত্রে সাধারণ অভ্যন্তরীণ শ্রেণিকে ডেকে আনে

    Outer 0=new Outer(); Outer.Inner i= O.new Inner();

  4. বাইরের শ্রেণীর উদাহরণ ক্ষেত্রের ক্ষেত্রে অভ্যন্তরীণ শ্রেণির স্বাভাবিক অভ্যর্থনা জানানো।

    Inner i=new Inner();

  5. বাইরের শ্রেণীর বাইরে সাধারণ অভ্যন্তর শ্রেণীর দিকে আহ্বান জানাতে অভ্যন্তরীণ।

    Outer 0=new Outer(); Outer.Inner i= O.new Inner();

  6. অভ্যন্তরীণ বর্গ ভিতরে অভ্যন্তর বর্গ এই পয়েন্টার।

    this.member-current inner class outerclassname.this--outer class

  7. অভ্যন্তর শ্রেণীর জন্য প্রযোজ্য সংশোধক হ'ল - সর্বজনীন, ডিফল্ট,

    final,abstract,strictfp,+private,protected,static

  8. বহিরাগত $ অভ্যন্তরীণটি অভ্যন্তরীণ শ্রেণীর নামের নাম।

  9. উদাহরণস্বরূপ অভ্যন্তরীণ শ্রেণীর অভ্যন্তরীণ ক্লাসটি তারপরে আমরা স্থির এবং বাইরের শ্রেণীর উদাহরণ ক্ষেত্রটি অ্যাক্সেস করতে পারি।

স্ট্যাটিক পদ্ধতির অভ্যন্তরে 10.iner শ্রেণি তখন আমরা কেবল স্থিতিশীল ক্ষেত্রে অ্যাক্সেস করতে পারি

বাইরের ক্লাস

class outer{

    int x=10;
    static int y-20;

    public void m1() {
        int i=30;
        final j=40;

        class inner{

            public void m2() {
                // have accees x,y and j
            }
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.