ইন্টারফেসের মধ্যে অভ্যন্তরীণ বর্গ


98

ইন্টারফেসের মধ্যে কি কোনও অভ্যন্তর শ্রেণি তৈরি করা সম্ভব ?
যদি এটি সম্ভব হয় তবে কেন আমরা কোনও ইন্টারফেস অবজেক্ট তৈরি করতে যাচ্ছি না কেন আমরা সেই জাতীয় অভ্যন্তর শ্রেণি তৈরি করতে চাইব ?

এই অভ্যন্তরীণ শ্রেণিগুলি কোনও উন্নয়ন প্রক্রিয়াতে সহায়তা করে?

উত্তর:


51

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

যাইহোক, নিম্নলিখিতগুলি সূক্ষ্মভাবে সংকলন করে:

public interface A {
    class B {
    }
}

আমি দেখেছি এটি ইন্টারফেস সংজ্ঞায় সরাসরি কিছু ধরণের "চুক্তি পরীক্ষক" রাখার জন্য ব্যবহৃত হয়েছিল (ভাল, ইন্টারফেসে আটকানো শ্রেণিতে, যা স্থির পদ্ধতি থাকতে পারে, ইন্টারফেসের বিপরীতে, যা পারে না)। আমি যদি সঠিকভাবে মনে করি তবে এটির মতো দেখাচ্ছে।

public interface A {
    static class B {
        public static boolean verifyState( A a ) {
            return (true if object implementing class A looks to be in a valid state)
        }
    }
}

নোট করুন যে আমি এই জাতীয় ব্যবহারের বিষয়ে কোনও মন্তব্য করছি না, আমি কেবল আপনার প্রশ্নের জবাব দিচ্ছি: এটি করা যেতে পারে এবং এটি আমি এর তৈরির এক ধরণের ব্যবহার।

এখন আমি এ জাতীয় নির্মাণের দরকারীতা এবং আমি যে দেখেছি সে সম্পর্কে মন্তব্য করব না: আমি এটি দেখেছি, তবে এটি খুব সাধারণ নির্মাণ নয়।

এখানে 200 কেবিএল কোডবেস যেখানে ঠিক শূন্য সময় হয় (তবে তারপরে আমরা এমন অনেকগুলি জিনিস পেয়েছি যা আমরা খারাপ অভ্যাসগুলি বিবেচনা করি যা হ'ল শূন্য সময়তে ঘটে যা অন্য লোকেরা একেবারে স্বাভাবিক দেখতে পায় তাই ...)।


আপনি ব্যবহারের কয়েকটি উদাহরণ যুক্ত করতে পারেন? আমি কিছু সময় আগে অনুরূপ কিছু পরীক্ষা করেছি এবং বুঝতে পারি নি যে এই নির্মাণটি ব্যবহার করে আমি কী অর্জন করতে পারি।
রোমান

@ রোমান: ভাল আমি মনে করি আমি কোনও প্রকল্পে এটির মুখোমুখি হয়েছি (তুলনামূলকভাবে পরিষ্কার প্রকল্প আমি যুক্ত করব তবে সেগুলি আমার ছিল না) তবে আমি জানি না এটি সত্যিই পরিষ্কার কিনা না। আমি একটি ছোট্ট উদাহরণ যোগ করেছি যা দেখেছি যা দেখতে দেখতে আবার দেখেছি তবে আবার: এটি আমার কোড ছিল না এবং আমি সেই নির্মাণটি ব্যবহার করছি না তাই আমি বৈধ উদাহরণ সহকারে আসার পক্ষে সবচেয়ে যোগ্য নই :) IIRC শ্রেণীর অভ্যন্তর সর্বদা নামকরণ করা হত, উদাহরণস্বরূপ স্টেটচেকার এবং কলগুলি সর্বদা দেখতে পাওয়া যেত: এ.স্টেটচেকার.এক (ক) বা এর মতো কিছু।
সিনট্যাক্স T3rr0r

8
যদি আপনি বলেন যে "" স্থিতিশীল অভ্যন্তর শ্রেণি "বলে কিছু নেই" তবে আপনার উত্তর যে "আপনি একটি জাভা ইন্টারফেসের ভিতরে নেস্টেড বর্গ বা অভ্যন্তরীণ শ্রেণি উভয়ই তৈরি করতে পারেন " মূলত ভুল is আপনার সংকীর্ণ সংজ্ঞাটি ব্যবহার করে interfaceএর অভ্যন্তরীণ ক্লাস থাকতে পারে না । আপনি বাদ দিতে পারেনstatic কোনও interfaceনেস্টেড ক্লাসের মডিফায়ারটিকে তবে তবুও এটি কোনও নেস্টেড বর্গ, কোনও অভ্যন্তর শ্রেণি নয়।
হলগার

6
এই উত্তরটি ভুল। ইন্টারফেসে স্থির নেস্টেড ক্লাস থাকতে পারে তবে অভ্যন্তর শ্রেণি নেই।
পল বোডিংটন

4
@ পলবডিংটন আপনি ঠিক বলেছেন এমনকি 'স্ট্যাটিক' অপসারণ করেও, Bক্লাসটি একটি স্থির নেস্টেড শ্রেণি নয় অভ্যন্তরীণ শ্রেণি; ইন্টারফেস বিশেষ চিকিত্সা পেতে। আমি অনলাইনেই এই স্পেসটি ব্যতীত অনলাইনের উল্লেখ খুঁজে পাইনি: "একটি ইন্টারফেসের একটি সদস্য শ্রেণি সুস্পষ্টভাবে স্থিতিশীল তাই এটি কখনও অভ্যন্তরীণ শ্রেণি হিসাবে বিবেচিত হয় না।" docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.3
সর্বোচ্চ

111

হ্যাঁ, আমাদের ইন্টারফেসের ভিতরে ক্লাস থাকতে পারে। ব্যবহারের একটি উদাহরণ হতে পারে

public interface Input
{
    public static class KeyEvent {
         public static final int KEY_DOWN = 0;
         public static final int KEY_UP = 1;
         public int type;
         public int keyCode;
         public char keyChar;
    }
    public static class TouchEvent {
         public static final int TOUCH_DOWN = 0;
         public static final int TOUCH_UP = 1;
         public static final int TOUCH_DRAGGED = 2;
         public int type;
         public int x, y;
         public int pointer;
    }
    public boolean isKeyPressed(int keyCode);
    public boolean isTouchDown(int pointer);
    public int getTouchX(int pointer);
    public int getTouchY(int pointer);
    public float getAccelX();
    public float getAccelY();
    public float getAccelZ();
    public List<KeyEvent> getKeyEvents();
    public List<TouchEvent> getTouchEvents();
}

এখানে কোডটিতে দুটি নেস্টেড ক্লাস রয়েছে যা ইভেন্ট অবজেক্টগুলি সম্পর্কে তথ্য এনপ্যাপুলেট করার জন্য যা পরে getKeyEvents () এর মতো পদ্ধতি সংজ্ঞাতে ব্যবহৃত হয়। ইনপুট ইন্টারফেসের ভিতরে সেগুলি সংহতি উন্নত করে।


4
@ লিভিট শুধু ভাবছেন, বাস্তবায়িত শ্রেণি কেমন হবে?
5:56

4
উপরের ব্যবহারের জন্য ক্রিয়াকলাপে একটি বাস্তবায়ন দেখতে পছন্দ করবে। ধন্যবাদ.
প্রকাশ কে

46

একটি বৈধ ব্যবহার, আইএমএইচও, অন্তর্ভুক্ত ইন্টারফেস পদ্ধতি দ্বারা প্রাপ্ত বা ফিরে প্রাপ্ত বস্তুগুলির সংজ্ঞা দিচ্ছে। টিপিকভাবে ডেটা হোল্ডিং স্ট্রাকচার। এইভাবে, যদি বস্তুটি কেবল সেই ইন্টারফেসের জন্য ব্যবহার করা হয় তবে আপনার কাছে আরও সমন্বিত উপায়ে জিনিস রয়েছে।

উদাহরণস্বরূপ:

interface UserChecker {
   Ticket validateUser(Credentials credentials);

   class Credentials {
      // user and password
   }

   class Ticket {
      // some obscure implementation
   }
}

তবে যাইহোক ... এটি কেবল স্বাদের বিষয়।


36

জাভা 7 স্পেস থেকে উদ্ধৃতি :

ইন্টারফেসে সদস্য প্রকারের ঘোষণা (§8.5) থাকতে পারে।

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

জাভা ইন্টারফেসের মধ্যে অ-স্থির ক্লাসগুলি ঘোষণা করা সম্ভব নয়, যা আমার কাছে বোধগম্য।


ধন্যবাদ. এটি সম্ভবত সবার সবচেয়ে সংক্ষিপ্ত উত্তর।
জোসেফ

4
এটি আমি উত্তরটি খুঁজছিলাম যা .. তবে ওপি বেশ কয়েকটি প্রশ্ন জিজ্ঞাসা করে .. যাইহোক আমার আপডেটআপ আছে।
চার্লি ওয়ালেস

11

একটি আকর্ষণীয় ব্যবহারের ক্ষেত্রটি এখানে বর্ণিত একটি অভ্যন্তরীণ শ্রেণীর মাধ্যমে ইন্টারফেস পদ্ধতিতে এক ধরণের ডিফল্ট বাস্তবায়ন সরবরাহ করা হয়: https://stackoverflow.com/a/3442218/454667 (একক শ্রেণির-উত্তরাধিকারের সমস্যাটি কাটিয়ে উঠতে)।


এবং এ কারণেই বেসরকারী সদস্য শ্রেণিগুলি বোঝায়।
ভিনসেন্ট

7

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

interface MyInterface {

   public static class MyInterfaceException extends Exception {
   }

   void doSomething() throws MyInterfaceException;
}

7

হ্যাঁ একটি ইন্টারফেসের মধ্যে স্থির শ্রেণীর সংজ্ঞা থাকা সম্ভব, তবে এনাম টাইপগুলি (যা বিশেষ ধরণের স্ট্যাটিক ক্লাস) ব্যবহার করার সময় এই বৈশিষ্ট্যের সবচেয়ে কার্যকর দিকটি হতে পারে। উদাহরণস্বরূপ আপনার এই জাতীয় কিছু থাকতে পারে:

public interface User {
    public enum Role {
        ADMIN("administrator"),
        EDITOR("editor"),
        VANILLA("regular user");

        private String description;

        private Role(String description) {
            this.description = description;
        }

        public String getDescription() {
            return description;
        }
    }

    public String getName();
    public void setName(String name);
    public Role getRole();
    public void setRole(Role role);
    ...
}

1

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


1

আপনি যখন আরও বিভিন্ন বাস্তবায়ন আচরণের মতো আরও জটিল নির্মাণ চান, তখন বিবেচনা করুন:

public interface A {
    public void foo();

    public static class B implements A {
        @Override
        public void foo() {
            System.out.println("B foo");
        }
    }
}

এটি আপনার ইন্টারফেস এবং এটি প্রয়োগকারী হবে:

public class C implements A {
    @Override
    public void foo() {
        A.B b = new A.B();
        b.foo(); 
    }

    public static void main(String[] strings) {
        C c = new C();
        c.foo();
    }
}

কিছু স্থির বাস্তবায়ন সরবরাহ করতে পারে, তবে তা বিভ্রান্তিকর হবে না, আমি জানি না।


0

আমি এই ধরনের নির্মাণের জন্য একটি ব্যবহারের সন্ধান পেয়েছি।

  1. আপনি সমস্ত স্ট্যাটিক ফাইনাল কনস্ট্যান্টকে সংজ্ঞায়িত এবং গোষ্ঠী করতে এই নির্মাণটি ব্যবহার করতে পারেন।
  2. যেহেতু, এটি একটি ইন্টারফেস তাই আপনি এটি কোনও শ্রেণিতে প্রয়োগ করতে পারেন।

আপনার গোষ্ঠীভুক্ত সমস্ত স্থির অ্যাক্সেস রয়েছে; শ্রেণীর নাম এই ক্ষেত্রে নাম স্থান হিসাবে কাজ করে।


0

আপনি এই ইন্টারফেসটি প্রয়োগ করে এমন বস্তুর জন্য সাধারণ কার্যকারিতার জন্য "সহায়তাকারী" স্ট্যাটিক ক্লাসও তৈরি করতে পারেন:

public interface A {
    static class Helper {
        public static void commonlyUsedMethod( A a ) {
           ...
        }
    }
}

0

আমার এখনই দরকার। আমার একটি ইন্টারফেস রয়েছে যেখানে এটির বেশ কয়েকটি পদ্ধতি থেকে কোনও অনন্য ক্লাস ফিরিয়ে দেওয়া সুবিধাজনক হবে। এই ইন্টারফেসের পদ্ধতিগুলির প্রতিক্রিয়াগুলির জন্য এই শ্রেণিটি কেবলমাত্র ধারক হিসাবে অর্থবোধ করে।

সুতরাং, এটি একটি স্থির নেস্টেড বর্গ সংজ্ঞা রাখা সুবিধাজনক হবে, যা কেবলমাত্র এই ইন্টারফেসের সাথে সম্পর্কিত, কারণ এই ইন্টারফেসটি এমন একমাত্র স্থান হওয়া উচিত যেখানে এই ফলাফলের ধারক শ্রেণীটি তৈরি করা হয়েছিল।


0

গ্রোভির উদাহরণস্বরূপ বৈশিষ্ট্যগুলি (বাস্তবায়িত পদ্ধতির সাথে স্মিথ ইন্টারফেসের মতো)। এগুলি একটি ইন্টারফেসে সংকলিত হয় যেখানে অভ্যন্তর শ্রেণি রয়েছে যেখানে সমস্ত পদ্ধতি প্রয়োগ করা হয়।

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