জাভাতে বেনামে অভ্যন্তরীণ ক্লাসগুলি কীভাবে ব্যবহৃত হয়?


309

জাভাতে বেনাম শ্রেণীর ব্যবহার কী? আমরা কি বলতে পারি যে বেনাম শ্রেণীর ব্যবহার জাভা অন্যতম সুবিধা?


67
এটি জাভাতে খুব একটা সুবিধা নয় কারণ এটি জাভাতে বন্ধের অভাব ঘিরে কাজ করার উপায় around
এরিক উইলসন

4
জাভা 8 ল্যাম্বডা এক্সপ্রেশনগুলিও চালু করেছে। : উত্তর চেক stackoverflow.com/questions/355167/...
akhil_mittal

উত্তর:


369

একটি "বেনাম শ্রেণি" দ্বারা, আমি এটি গ্রহণ করি আপনার অর্থ বেনামে অভ্যন্তর শ্রেণি

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

আমি এটি ইভেন্ট শ্রোতাদের সংযুক্ত করার জন্য একটি শর্টকাট হিসাবে ব্যবহার করার ঝোঁক:

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // do something
    }
});

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

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


5
অথবা আপনি অজ্ঞাতনামা অভ্যন্তর শ্রেণীর (এবং সম্ভবত কিছু অন্যান্য সদৃশ কোড) দিয়ে এক পদ্ধতিতে বেনামে অভ্যন্তরীণ ক্লাসগুলি নকল করতে পারেন।
টম হাটিন -

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

5
খুব সুন্দরভাবে ব্যাখ্যা করা হয়েছে, এমনকি কঠোর আমিও কাউকে এটি পড়ার পরামর্শ দিচ্ছি এবং দেখুন জাভা 8 এবং ল্যাম্বডা এক্সপ্রেশনটি কোডিংকে আরও দ্রুত এবং আরও বেশি পঠনযোগ্য করে তুলতে পারে।
পাইভিস

2
@ ইউজার 2190639 অবিকল, জাভা 8-এ ল্যাম্বদার
বোন কোডিগো

3
কেন আপনি বলেন overloading methodsএবং না overriding methods?
তরুণ

73

বেনামি অভ্যন্তরীণ ক্লাসগুলি কার্যকরভাবে বন্ধ হয়ে যায়, তাই এগুলি ল্যাম্বদা এক্সপ্রেশন বা "প্রতিনিধি" অনুকরণ করতে ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, এই ইন্টারফেসটি নিন:

public interface F<A, B> {
   B f(A a);
}

আপনি এটি বেনামে জাভাতে প্রথম শ্রেণির ফাংশন তৈরি করতে ব্যবহার করতে পারেন । আসুন ধরা যাক আপনার নিম্নলিখিত পদ্ধতি রয়েছে যা প্রদত্ত তালিকায় আমার চেয়ে প্রথম সংখ্যাটি বৃহত্তর দেয় বা আমি যদি সংখ্যাটি বড় না হয়:

public static int larger(final List<Integer> ns, final int i) {
  for (Integer n : ns)
     if (n > i)
        return n;
  return i;
}

এবং তারপরে আপনার অন্য একটি পদ্ধতি রয়েছে যা প্রদত্ত তালিকার চেয়ে আমার চেয়ে প্রথম সংখ্যাটি ছোট দেখাচ্ছে, বা আমি যদি সংখ্যাটি ছোট না হয়:

public static int smaller(final List<Integer> ns, final int i) {
   for (Integer n : ns)
      if (n < i)
         return n;
   return i;
}

এই পদ্ধতিগুলি প্রায় অভিন্ন। প্রথম শ্রেণীর ফাংশন টাইপ এফ ব্যবহার করে, আমরা এগুলি একটি পদ্ধতিতে আবার লিখতে পারি:

public static <T> T firstMatch(final List<T> ts, final F<T, Boolean> f, T z) {
   for (T t : ts)
      if (f.f(t))
         return t;
   return z;
}

প্রথম ম্যাচ পদ্ধতিটি ব্যবহার করতে আপনি একটি বেনাম শ্রেণি ব্যবহার করতে পারেন:

F<Integer, Boolean> greaterThanTen = new F<Integer, Boolean> {
   Boolean f(final Integer n) {
      return n > 10;
   }
};
int moreThanMyFingersCanCount = firstMatch(xs, greaterThanTen, x);

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

এই স্টাইলে জাভা প্রোগ্রামিংয়ের জন্য একটি দুর্দান্ত গ্রন্থাগার: কার্যকরী জাভা।


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

27
জাভা সংক্ষিপ্ততার সাথে কার্যকরী প্রোগ্রামিংয়ের সমস্ত বোধগম্যতা!
অ্যাডাম জ্যাসকিউইচ

3
আমার অভিজ্ঞতা অনুসারে, জাভাতে কার্যক্ষম শৈলীর জন্য ভারবোসিটি আপ ফ্রন্টের জন্য অর্থ প্রদান করা হয়, তবে এটি দীর্ঘকালীনভাবে ব্রুভিটি দেয়। উদাহরণস্বরূপ, myList.map (f) লুপ সম্পর্কিত তুলনায় যথেষ্ট কম ভার্বোস।
অ্যাপোক্যালিস্প

2
কর্মক্ষম প্রোগ্রামিং শৈলীর ভাষা স্কালা , জেভিএম-এর অভ্যন্তরে ভালভাবে চলে এবং কার্যকরী-প্রোগ্রামিং দৃশ্যের জন্য একটি বিকল্প হতে পারে।
ড্যারেল টিগু

51

বেনামে অভ্যন্তর শ্রেণি নিম্নলিখিত পরিস্থিতিতে ব্যবহৃত হয়:

১) ওভাররাইডিং (সাব ক্লাসিং) এর জন্য, যখন ক্লাস সংজ্ঞাটি বর্তমান কেস ব্যতীত ব্যবহারযোগ্য নয়:

class A{
   public void methodA() {
      System.out.println("methodA");
    }
}
class B{
    A a = new A() {
     public void methodA() {
        System.out.println("anonymous methodA");
     }
   };
}

২) একটি ইন্টারফেস বাস্তবায়নের জন্য, যখন কেবলমাত্র বর্তমান ক্ষেত্রে ইন্টারফেস প্রয়োগ করা প্রয়োজন:

interface interfaceA{
   public void methodA();
}
class B{
   interfaceA a = new interfaceA() {
     public void methodA() {
        System.out.println("anonymous methodA implementer");
     }
   };
}

৩) যুক্তি অজ্ঞাতনামা অভ্যন্তর শ্রেণীর সংজ্ঞায়িত:

 interface Foo {
   void methodFoo();
 }
 class B{
  void do(Foo f) { }
}

class A{
   void methodA() {
     B b = new B();
     b.do(new Foo() {
       public void methodFoo() {
         System.out.println("methodFoo");
       } 
     });
   } 
 } 

8
দুর্দান্ত উত্তর, 3 এর মতো দেখতে)) ইভেন্ট শ্রোতার জন্য ব্যবহৃত প্যাটার্নটি হল
xdl

47

আমি এগুলি কখনও কখনও মানচিত্রের তাত্ক্ষণিকতার জন্য সিনট্যাক্স হ্যাক হিসাবে ব্যবহার করি:

Map map = new HashMap() {{
   put("key", "value");
}};

বনাম

Map map = new HashMap();
map.put("key", "value");

প্রচুর পুট বিবৃতি দেওয়ার সময় এটি কিছুটা অতিরিক্ত বাঁচায়। যাইহোক, বহিরাগত ক্লাসটি যখন রিমোটিংয়ের মাধ্যমে ক্রমিকায়িত করা দরকার তখন আমি এটি করতে সমস্যাও বোধ করি।


56
স্পষ্টতই, ধনুর্বন্ধকের প্রথম সেটটি বেনামে অভ্যন্তর শ্রেণি (হ্যাশম্যাপ সাবক্লাসিং)। ধনুর্বন্ধকের দ্বিতীয় সেটটি হ'ল একটি হ'ল ইনস্ট্যানিশাইজার (স্থির চেয়ে বরং) যা আপনার হ্যাশম্যাপ সাবক্লাসে মান সেট করে। এটি উল্লেখ করার জন্য +1, noobs এর জন্য এটি বানান না করার জন্য -1। ;
ডি

4
ডাবল-ব্রেস সিনট্যাক্স সম্পর্কে আরও পড়ুন এখানে
মার্টিন অ্যান্ডারসন


18

এগুলি সাধারণত কলব্যাকের ভারবোজ ফর্ম হিসাবে ব্যবহৃত হয়।

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

এখানে একটি দোল উদাহরণ

myButton.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e) {
        // do stuff here...
    }
});

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


1
আপনি বোঝাতে চেয়েছিলেন? এটি যদি ভার্বোস হয়ে থাকে, কলব্যাকটি আলাদা থাকত, এটি কিছুটা বড় করে তোলে এবং এভাবে ভার্ভোজ করে। আপনি যদি বলেন যে এটি এখনও ভার্বোস, তবে একটি ক্ষতিকারক রূপটি কী হবে?
ব্যবহারকারী 3081519

1
@ ব্যবহারকারী 3081519, এর মতো myButton.addActionListener(e -> { /* do stuff here */})বা myButton.addActionListener(stuff)খুব ভাল কিছু হবে।
স্যামুয়েল এডউইন ওয়ার্ড

8

আপনি এটি এমন পরিস্থিতিতে ব্যবহার করেন যেখানে অন্য ফাংশনের অভ্যন্তরে নির্দিষ্ট উদ্দেশ্যে আপনার ক্লাস তৈরি করা প্রয়োজন, যেমন শ্রোতা হিসাবে, রান্নেবল (একটি থ্রেড স্প্যান করার জন্য) ইত্যাদি etc.

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

এগুলি মূলত সিনট্যাকটিক চিনি এবং এগুলি বড় হওয়ার সাথে সাথে সাধারণত অন্যত্র সরিয়ে নেওয়া উচিত।

আমি নিশ্চিত নই যে এটি জাভার অন্যতম সুবিধার কিনা তবে আপনি যদি সেগুলি ব্যবহার করেন (এবং আমরা সকলেই এটি ব্যবহার করি, দুর্ভাগ্যক্রমে) তবে আপনি তর্ক করতে পারেন যে সেগুলি একটি।


6

বেনাম শ্রেণীর জন্য গাইডলাইনস।

  1. বেনাম শ্রেণি একসাথে ঘোষিত হয় এবং শুরু হয়।

  2. বেনাম শ্রেণীর এক এবং একমাত্র শ্রেণি বা ইন্টারফেস রেসপন্ডকে প্রসারিত বা প্রয়োগ করতে হবে।

  3. অজ্ঞাতনামা শ্রেণীর কোনও নাম না থাকায় এটি কেবল একবার ব্যবহার করা যেতে পারে।

উদাহরণ:

button.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub

    }
});

# 3 সম্পর্কিত: সম্পূর্ণ সত্য নয়। প্রতিবিম্ব সহ আপনি বেনামী শ্রেণীর একাধিক উদাহরণ অর্জন করতে পারেন ref.getClass().newInstance()
আইকজা

বিধিগুলি প্রশ্নের উত্তর দেয় না।
মার্নকুইস লার্নের

5

হ্যাঁ, বেনামে অভ্যন্তরীণ ক্লাসগুলি অবশ্যই জাভার অন্যতম সুবিধা।

বেনামে অভ্যন্তরীণ শ্রেণীর সাথে আপনার আশেপাশের শ্রেণীর চূড়ান্ত এবং সদস্য ভেরিয়েবলগুলি অ্যাক্সেস রয়েছে এবং এটি শ্রোতাদের মধ্যে উপকারে আসে etc.

তবে একটি বড় সুবিধা হ'ল অভ্যন্তরীণ শ্রেণীর কোড, যা (কমপক্ষে হওয়া উচিত) চারপাশের শ্রেণি / পদ্ধতি / ব্লকের সাথে দৃly়ভাবে সংযুক্ত, এর একটি নির্দিষ্ট প্রসঙ্গ রয়েছে (পার্শ্ববর্তী শ্রেণি, পদ্ধতি এবং ব্লক)।


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

5
new Thread() {
        public void run() {
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                System.out.println("Exception message: " + e.getMessage());
                System.out.println("Exception cause: " + e.getCause());
            }
        }
    }.start();

এটি থ্রেড ব্যবহার করে বেনামে অভ্যন্তরীণ প্রকারের অন্যতম উদাহরণ


3

আমি নতুন থ্রেড কল করার জন্য বেনামে জিনিস ব্যবহার করি ..

new Thread(new Runnable() {
    public void run() {
        // you code
    }
}).start();

3

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

আমাদের ক্লাস রয়েছে যেখানে ডক থেকে উদাহরণটি বিবেচনা করুন Person:

public class Person {

    public enum Sex {
        MALE, FEMALE
    }

    String name;
    LocalDate birthday;
    Sex gender;
    String emailAddress;

    public int getAge() {
        // ...
    }

    public void printPerson() {
        // ...
    }
}

এবং অনুসন্ধানের মানদণ্ডগুলির সাথে মেলে এমন সদস্যদের মুদ্রণের জন্য আমাদের একটি পদ্ধতি রয়েছে:

public static void printPersons(
    List<Person> roster, CheckPerson tester) {
    for (Person p : roster) {
        if (tester.test(p)) {
            p.printPerson();
        }
    }
}

যেখানে CheckPersonএকটি ইন্টারফেস মত:

interface CheckPerson {
    boolean test(Person p);
}

এখন আমরা বেনাম শ্রেণীর ব্যবহার করতে পারি যা অনুসন্ধানের মানদণ্ডটি নির্দিষ্ট করার জন্য এই ইন্টারফেসটিকে কার্যকর করে:

printPersons(
    roster,
    new CheckPerson() {
        public boolean test(Person p) {
            return p.getGender() == Person.Sex.MALE
                && p.getAge() >= 18
                && p.getAge() <= 25;
        }
    }
);

এখানে ইন্টারফেসটি খুব সাধারণ এবং বেনাম শ্রেণীর বাক্য গঠনটি অযৌক্তিক এবং অস্পষ্ট বলে মনে হয়।

জাভা 8 একটি শব্দ ফাংশনাল ইন্টারফেস চালু করেছে যা কেবলমাত্র একটি বিমূর্ত পদ্ধতি সহ একটি ইন্টারফেস, তাই আমরা বলতে পারি CheckPersonএকটি কার্যকরী ইন্টারফেস। আমরা ল্যাম্বডা এক্সপ্রেশন ব্যবহার করতে পারি যা পদ্ধতির তর্ক হিসাবে আমাদের ফাংশনটি পাস করতে দেয়:

printPersons(
                roster,
                (Person p) -> p.getGender() == Person.Sex.MALE
                        && p.getAge() >= 18
                        && p.getAge() <= 25
        );

আমরা ইন্টারফেসের Predicateজায়গায় একটি আদর্শ ক্রিয়ামূলক ইন্টারফেস ব্যবহার করতে পারি CheckPerson, যা প্রয়োজনীয় কোডের পরিমাণ আরও কমিয়ে দেবে।


2

বেনামে অভ্যন্তর শ্রেণি বিভিন্ন উপকরণের জন্য বিভিন্ন বাস্তবায়ন দেওয়ার সময় উপকারী হতে পারে। এটি খুব অল্প পরিমাণে ব্যবহার করা উচিত কারণ এটি প্রোগ্রামের পাঠযোগ্যতার জন্য সমস্যা তৈরি করে।


1

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

সুতরাং উপরে উল্লিখিত সত্যটি বিবেচনা করে আপনি কেবল বেনাম শ্রেণীর মতো ব্যবহার করতে পারেন:

public class HeavyClass{
    private final Object finalizerGuardian = new Object() {
        @Override
        protected void finalize() throws Throwable{
            //Finalize outer HeavyClass object
        }
    };
}

এই কৌশলটি ব্যবহার করে আপনি নিজেকে এবং আপনার অন্যান্য বিকাশকারীকে কল করতে মুক্তি দিয়েছেন super.finalize() প্রতিটি উপ-শ্রেণীরHeavyClass যার জন্য চূড়ান্ত পদ্ধতিটি প্রয়োজন।


1

আপনি এইভাবে বেনাম শ্রেণি ব্যবহার করতে পারেন

TreeSet treeSetObj = new TreeSet(new Comparator()
{
    public int compare(String i1,String i2)
    {
        return i2.compareTo(i1);
    }
});

1

এখানে কেউ উল্লেখ করেছেন বলে মনে হচ্ছে তবে আপনি জেনেরিক ধরণের আর্গুমেন্ট ধরে রাখতে বেনামে বর্গও ব্যবহার করতে পারেন (যা সাধারণত মুছে ফেলার কারণে হারিয়ে যায়) :

public abstract class TypeHolder<T> {
    private final Type type;

    public TypeReference() {
        // you may do do additional sanity checks here
        final Type superClass = getClass().getGenericSuperclass();
        this.type = ((ParameterizedType) superClass).getActualTypeArguments()[0];
    }

    public final Type getType() {
        return this.type;
    }
}

আপনি যদি বেনামে এই ক্লাসটি ইনস্ট্যান্ট করবেন

TypeHolder<List<String>, Map<Ineger, Long>> holder = 
    new TypeHolder<List<String>, Map<Ineger, Long>>() {};

তারপর যেমন holder উদাহরণটিতে পাসের ধরণের অ-মুছে ফেলা সংজ্ঞা থাকবে।

ব্যবহার

এটি ভ্যালিডেটর / ডিসরিওলিজেটর তৈরির জন্য খুব কার্যকর is এছাড়াও আপনি জেনেরিক টাইপ প্রতিবিম্ব সহ ইনস্ট্যান্টিয়েট করতে পারেন (তাই যদি আপনি কখনও new T()প্যারামিট্রাইজড টাইপ করতে চান - আপনাকে স্বাগতম!)

অপূর্ণতা / সীমাবদ্ধতা

  1. আপনার জেনেরিক পরামিতি স্পষ্টভাবে পাস করা উচিত। এটি করতে ব্যর্থ হলে প্যারামিটার ক্ষয় টাইপ হবে
  2. প্রতিটি ইনস্ট্যান্টেশন আপনাকে সংকলক দ্বারা উত্পন্ন অতিরিক্ত ক্লাসের জন্য ব্যয় করবে যা ক্লাসপাথ দূষণ / জার ব্লাটিংয়ের দিকে পরিচালিত করে

1

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

import java.util.Scanner;
abstract class AnonymousInner {
    abstract void sum();
}

class AnonymousInnerMain {
    public static void main(String []k){
        Scanner sn = new Scanner(System.in);
        System.out.println("Enter two vlaues");
            int a= Integer.parseInt(sn.nextLine());
            int b= Integer.parseInt(sn.nextLine()); 
        AnonymousInner ac = new AnonymousInner(){
            void sum(){
                int c= a+b;
                System.out.println("Sum of two number is: "+c);
            }
        };
        ac.sum();
    }

}

1

একটি অজ্ঞাতনামা অভ্যন্তরীণ শ্রেণি এমন কোনও বস্তু তৈরি করতে ব্যবহৃত হয় যা আর কখনও উল্লেখ করা হবে না। এটির কোনও নাম নেই এবং ঘোষণা করা হয় এবং একই বিবৃতিতে তৈরি করা হয়। এটি ব্যবহৃত হয় যেখানে আপনি সাধারণত কোনও বস্তুর ভেরিয়েবল ব্যবহার করবেন would আপনি newকীওয়ার্ড, কনস্ট্রাক্টরের কাছে কল এবং শ্রেণীর সংজ্ঞা ভিতরে {এবং এর সাথে ভেরিয়েবলটি প্রতিস্থাপন করুন }

জাভাতে একটি থ্রেডেড প্রোগ্রাম লেখার সময়, এটি সাধারণত এটির মতো দেখায়

ThreadClass task = new ThreadClass();
Thread runner = new Thread(task);
runner.start();

এখানে ThreadClassব্যবহৃত ব্যবহারকারী সংজ্ঞায়িত করা হবে। এই শ্রেণিটি Runnableইন্টারফেসটি কার্যকর করবে যা থ্রেড তৈরির জন্য প্রয়োজনীয়। ইন পদ্ধতি (শুধুমাত্র পদ্ধতি ) পাশাপাশি বাস্তবায়িত করা প্রয়োজন। এটি স্পষ্ট যে পরিত্রাণ পাওয়া আরও কার্যকর হবে এবং ঠিক এ কারণেই বেনামে অন্তর্গত শ্রেণি বিদ্যমান।ThreadClassrun()RunnableThreadClass

নীচের কোডটি দেখুন

Thread runner = new Thread(new Runnable() {
    public void run() {
        //Thread does it's work here
    }
});
runner.start();

এই কোডটি taskসর্বাধিক উদাহরণে করা রেফারেন্সটি প্রতিস্থাপন করে । পৃথক শ্রেণি না করে, Thread()কনস্ট্রাক্টরের অনামুখী অভ্যন্তর শ্রেণি একটি নামহীন অবজেক্ট দেয় যা Runnableইন্টারফেস প্রয়োগ করে এবং run()পদ্ধতিটি ওভাররাইড করে । পদ্ধতিতে run()থ্রেডের জন্য প্রয়োজনীয় কাজটি করে এমন বিবৃতি অন্তর্ভুক্ত করা হবে।

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

তথ্যসূত্র: স্যামস 21 দিনের সপ্তম সংস্করণে নিজেকে জাভা শেখায়


0

আরও একটি সুবিধা:
আপনি জানেন যে জাভা একাধিক উত্তরাধিকার সমর্থন করে না, সুতরাং আপনি যদি "থ্রেড" কিন্ডা ক্লাস বেনাম শ্রেণি হিসাবে ব্যবহার করেন তবে ক্লাসটির এখনও অন্য শ্রেণীর জন্য প্রসারিত করার জন্য একটি স্থান বাকি আছে।

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