একটি ইন্টারফেসে সংজ্ঞায়িত পদ্ধতির "ডিফল্ট" বাস্তবায়ন কী?


91

সংগ্রহ ইন্টারফেসে আমি একটি পদ্ধতি পেয়েছি যার নাম removeIf()এটি প্রয়োগ করে।

default boolean removeIf(Predicate<? super E> filter) {
    Objects.requireNonNull(filter);  
    boolean removed = false;  
    final Iterator<E> each = iterator();   
    while (each.hasNext()) {  
        if (filter.test(each.next())) {  
            each.remove();  
            removed = true;  
        }  
    }  
    return removed;  
}  

আমি জানতে চাই যে কোনও ইন্টারফেসে মেথড বডি সংজ্ঞায়নের কোনও উপায় আছে কিনা? কীওয়ার্ডটি
কী defaultএবং এটি কীভাবে কাজ করে?



সম্পর্কিত পোস্ট stackoverflow.com/questions/31578427/…
রবি

উত্তর:


162

Https://dzone.com/articles/interface-default-methods-java থেকে

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

public interface A {
    default void foo(){
       System.out.println("Calling A.foo()");
    }
}

public class ClassAB implements A {
}

একটি সাধারণ প্রশ্ন রয়েছে যে লোকেরা যখন প্রথমবারের জন্য নতুন বৈশিষ্ট্যটি শুনতে পায় তখন তারা ডিফল্ট পদ্ধতিগুলি সম্পর্কে জিজ্ঞাসা করে:

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

এই পরিস্থিতি চিত্রিত করার উদাহরণ:

public interface A {  
    default void foo(){  
        System.out.println("Calling A.foo()");  
    }  
}

public interface B {
    default void foo(){
        System.out.println("Calling B.foo()");
    }
}


public class ClassAB implements A, B {

}  

এই কোডটি নিম্নলিখিত ফলাফলগুলি সংকলন করতে ব্যর্থ হয়েছে:

java: class Clazz inherits unrelated defaults for foo() from types A and B

এটি ঠিক করার জন্য, ক্লাজে, আমাদের বিরোধী পদ্ধতিটি ওভাররাইড করে ম্যানুয়ালি এটি সমাধান করতে হবে:

public class Clazz implements A, B {
    public void foo(){}
}

তবে কী যদি আমরা আমাদের নিজস্ব প্রয়োগের পরিবর্তে ইন্টারফেস এ থেকে পদ্ধতি foo () এর ডিফল্ট প্রয়োগকরণ বলতে চাই call

নিম্নলিখিত হিসাবে A # foo () উল্লেখ করা সম্ভব:

public class Clazz implements A, B {
    public void foo(){
       A.super.foo();
    }
}

19
ধন্যবাদ, সত্যিই ভাল প্রদর্শন। আমার জিজ্ঞাসার সুযোগ পাওয়ার আগে আপনি আমার সমস্ত প্রশ্নের উত্তর দিয়েছিলেন।
জেফ হাচিনস

পরিবর্তে বিমূর্ত ব্যবহার করবেন না কেন?
অ্যাস্টল্ফো হোসার

4
@ অ্যাসল্ফোহোসচার আপনি কেবল একটি শ্রেণি বাড়িয়ে দিতে পারেন তবে আপনি একাধিক ইন্টারফেস প্রয়োগ করতে পারেন।
চার্লস উড

49

এই পদ্ধতিগুলিকে ডিফল্ট পদ্ধতি বলা হয়। ডিফল্ট পদ্ধতি বা ডিফেন্ডার পদ্ধতি জাভা 8- এ নতুন যুক্ত হওয়া বৈশিষ্ট্যগুলির মধ্যে একটি।

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

সুতরাং, যদি আপনার একটি ডিফল্ট পদ্ধতি সহ ইন্টারফেস থাকে:

public interface Hello {
    default void sayHello() {
        System.out.println("Hello");
    }
}

নিম্নলিখিত শ্রেণিটি পুরোপুরি বৈধ:

public class HelloImpl implements Hello {

}

আপনি যদি একটি উদাহরণ তৈরি করেন HelloImpl:

Hello hello = new HelloImpl();
hello.sayHello();  // This will invoke the default method in interface

উপকারী সংজুক:


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

4
নিবন্ধন করুন জাভা ৮ এর আগে এটি অনুমোদিত নয় তবে এই বৈশিষ্ট্যটি কেবল জাভা 8-এ যুক্ত করা হয়েছে। আপনি আপনার প্রয়োগকারী ক্লাসে ডিফল্ট পদ্ধতি প্রয়োগের বিষয়টি এড়াতে পারবেন ।
রোহিত জৈন

4
@ পবনমিশ্রা। আমার আগের মন্তব্য দেখুন। ক্লাস বাস্তবায়নে আপনার ডিফল্ট ইন্টারফেস পদ্ধতি প্রয়োগের প্রয়োজন নেই।
রোহিত জৈন

4
পবনমিশ্রা @ আপনি যদিও এটি ওভাররাইড করতে পারেন। আপনার কেবলমাত্র ডিফল্ট বাস্তবায়ন ব্যবহার করা দরকার এমন কোনও সীমাবদ্ধতা নেই।
অনিকেত ঠাকুর

4
একটি অগ্রণী পদক্ষেপ যা শেষ পর্যন্ত একাধিক উত্তরাধিকার দ্বারা বিস্মিত হওয়া এড়ানো হবে!
এক্সট্রিম বাইকার

17

আমি কিছুটা গবেষণা করেছি এবং আমি নিম্নলিখিতটি পেয়েছি। আশাকরি এটা সাহায্য করবে.

বিদ্যমান সমস্যা

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

জাভা 8 এ সমাধান গৃহীত হয়েছে

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

গুরুত্বপূর্ণ বিষয়গুলি লক্ষ করুন

  1. ইমপ্লিমেন্টাররা ক্লাস প্রয়োগের ক্ষেত্রে ডিফল্ট পদ্ধতি প্রয়োগ না করার জন্য বেছে নিতে পারেন।
  2. ইমপ্লিমেন্টাররা এখনও ডিফল্ট পদ্ধতিগুলিকে ওভাররাইড করতে পারে, যেমন নিয়মিত অ-চূড়ান্ত শ্রেণির পদ্ধতিগুলি সাবক্লাসগুলিতে ওভাররাইড করা যায়।
  3. বিমূর্ত শ্রেণিগুলি এমনকি (পুনরায়) ডিফল্ট পদ্ধতিগুলি বিমূর্ত হিসাবে ঘোষণা করতে পারে, উপশ্রেণীগুলিকে পদ্ধতির পুনর্বিবেচনা করতে বাধ্য করে (কখনও কখনও 'পুনরায় বিমূর্তি' নামে পরিচিত)।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.