জাভাতে ডিফল্ট কীওয়ার্ডের উদ্দেশ্য কী?


94

জাভাতে একটি ইন্টারফেস একটি শ্রেণীর অনুরূপ, তবে একটি ইন্টারফেসের মূল অংশে কেবল বিমূর্ত পদ্ধতি এবং finalক্ষেত্রগুলি (ধ্রুবক) অন্তর্ভুক্ত থাকতে পারে ।

সম্প্রতি, আমি একটি প্রশ্ন দেখেছি, যা দেখতে এটির মতো দেখাচ্ছে

interface AnInterface {
    public default void myMethod() {
        System.out.println("D");
    }
}

ইন্টারফেস সংজ্ঞা অনুযায়ী, কেবল বিমূর্ত পদ্ধতি অনুমোদিত are এটি আমাকে উপরের কোডটি সংকলন করার অনুমতি দেয় কেন? defaultকীওয়ার্ডটি কী ?

অন্যদিকে, যখন আমি কোডের নীচে লেখার চেষ্টা করছিলাম, তখন এটি বলে modifier default not allowed here

default class MyClass{

}

পরিবর্তে

class MyClass {

}

কেউ কি আমাকে defaultকীওয়ার্ডের উদ্দেশ্য বলতে পারেন ? এটি কি কেবল ইন্টারফেসের মধ্যেই অনুমোদিত? এটি কীভাবে আলাদা হয় default(অ্যাক্সেস মডিফায়ার নেই)?


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

4
@ ইরান আপনি কি ভাবেন না, ইন্টারফেস সংজ্ঞা লঙ্ঘন করে ডিফল্ট পদ্ধতি প্রবর্তন? : s
রবি

4
এটি ইন্টারফেস সংজ্ঞা পরিবর্তন করেছে। সেই সংজ্ঞাটি এখন পুরানো।
লুই ওয়াসারম্যান

4
ল্যাম্বডাসকে সমর্থন করার জন্য তাদের পরিচয় দেওয়া হয়েছিল। এগুলি কেন প্রয়োজন হয় তার বিশদটি লাম্বদা প্রকল্পের স্ট্রো ম্যান প্রস্তাবনায় রয়েছে।
স্প্রিন্টার

উত্তর:


74

এটি জাভা 8 এ একটি নতুন বৈশিষ্ট্য যা interfaceএকটি বাস্তবায়ন সরবরাহ করতে সহায়তা করে। জাভা 8 জেএলএস -13.5.6 এ বর্ণিত। ইন্টারফেস পদ্ধতি ঘোষণাগুলি যা পড়ে (অংশে)

একটি যোগ করার পদ্ধতি defaultপদ্ধতি, অথবা একটি পদ্ধতি পরিবর্তন করা থেকে abstractথেকে default, প্রাক বিদ্যমান বাইনেরিতে সাথে সামঞ্জস্যের ভাঙে না, কিন্তু একটি কারণ হতে পারে IncompatibleClassChangeErrorযদি পূর্ব বিদ্যমান বাইনারি প্রচেষ্টা পদ্ধতি ডাকা। এই সমস্যাটি ঘটে থাকে যদি যোগ্যতা অর্জন ধরন, Tদুই ইন্টারফেসগুলি একটি উপপ্রকার হয়, Iএবং J, যেখানে উভয় Iএবং Jএকটি ঘোষণা defaultএকই স্বাক্ষর এবং ফলাফল নিয়ে পদ্ধতি, এবং কেউই Iকিংবা Jঅন্যান্য একটি subinterface হয়।

জেডিকে 8-তে নতুন কী বলেছে (অংশে)

ডিফল্ট পদ্ধতিগুলি লাইব্রেরির ইন্টারফেসগুলিতে নতুন কার্যকারিতা যুক্ত করতে সক্ষম করে এবং সেই ইন্টারফেসগুলির পুরানো সংস্করণগুলির জন্য লিখিত কোডের সাথে বাইনারি সামঞ্জস্যতা নিশ্চিত করে।


16
দেখে মনে হচ্ছে, এখন ইন্টারফেস এবং বিমূর্ত শ্রেণি প্রায় একই রকম। :)
রবি

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

10
@ লুইস ওয়াসারম্যান: জাভা 9-এ, তাদের privateপদ্ধতি থাকতে পারে ।
হলগার

6
@ ড্যান প্যান্ট্রি: privateপদ্ধতিগুলি সত্যই ইন্টারফেসের অংশ নয়, তবে এটি defaultবাস্তবায়নের জন্য বা ধ্রুবক আরম্ভকারীদের মধ্যে সহায়ক সহায়ক হিসাবে কাজ করতে পারে । নোট করুন যে সেগুলি ইতিমধ্যে জাভা 8 এ বিদ্যমান রয়েছে, আপনি যখন ইন্টারফেসের মধ্যে ল্যাম্বডা এক্সপ্রেশন ব্যবহার করেন তখন সিন্থেটিক privateপদ্ধতি উত্পন্ন হয়। সুতরাং জাভা 9 আপনাকে সেই বৈশিষ্ট্যটি অ-সিন্থেটিক, নন ল্যাম্বদা পাশাপাশি ব্যবহার করার অনুমতি দেয় ...
হোলার

14
@jWeaver ইন্টারফেস এবং শ্রেণীর মধ্যে পার্থক্য রাষ্ট্র বনাম আচরণকে হ্রাস করে । ইন্টারফেসগুলি আচরণ বহন করতে পারে তবে কেবল শ্রেণিতেই রাষ্ট্র থাকতে পারে। (ক্ষেত্র, নির্মাতা এবং সমান / হ্যাশকোডের মতো পদ্ধতিগুলি রাষ্ট্র সম্পর্কে))
ব্রায়ান গোয়েজ

26

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

যদি আপনার ল্যাম্বডাসের defaultকারণে উত্থাপিত দাবিটি সম্পর্কে কিছুটা দৃinc় বিশ্বাসের প্রয়োজন হয় তবে নোট করুন যে ২০০৯ সালে মার্ক রেইনহোল্ড দ্বারা প্রজেক্ট ল্যাম্বডারের স্ট্রো ম্যান প্রস্তাবনায় ল্যাম্বডাসকে সমর্থন করার জন্য যুক্ত করা বাধ্যতামূলক বৈশিষ্ট্য হিসাবে 'এক্সটেনশন পদ্ধতিগুলি' উল্লেখ করা হয়েছে।

ধারণাটি দেখানোর জন্য এখানে একটি উদাহরণ রয়েছে:

interface Operator {
    int operate(int n);
    default int inverse(int n) {
        return -operate(n);
    }
}

public int applyInverse(int n, Operator operator) {
    return operator.inverse(n);
}

applyInverse(3, n -> n * n + 7);

আমি বুঝতে পারছি না তবে defaultল্যাম্বডাসকে কীভাবে সমর্থন করে তা চিত্রিত করা উচিত । কারণ inverseএটি একটি ডিফল্ট, প্রয়োজনে এটি প্রয়োগকারী শ্রেণীর দ্বারা সহজেই ওভাররাইড করা যায়।


8
এটি সত্যই সঠিক নয়। ল্যাম্বদাস সম্ভবত নিকৃষ্ট কারণ হতে পারে তবে তারা সত্যিই কেবল খড় ছিল যা উটের পিঠে ভেঙে দেয়। আসল প্রেরণা ছিল ইন্টারফেস বিবর্তনকে সক্ষম করা (বিদ্যমান আচরণগুলিকে নতুন আচরণের সমর্থনে তুলনামূলকভাবে বিবর্তিত হতে দেওয়া); ল্যাম্বডাস হতে পারে যে এই প্রয়োজনটি সামনে এনেছিল তবে বৈশিষ্ট্যটি এর চেয়ে সাধারণ।
ব্রায়ান গয়েটজ

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

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

4
সম্ভবত এই দস্তাবেজটি সহায়তা করবে: cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html । সেকশন 10 স্পষ্টভাবে বলেছে: "ডিফল্ট পদ্ধতির উদ্দেশ্য (পূর্বে ভার্চুয়াল এক্সটেনশন পদ্ধতি বা ডিফেন্ডার পদ্ধতি হিসাবে পরিচিত) তাদের প্রাথমিক প্রকাশের পরে ইন্টারফেসগুলি সুসংগত উপায়ে বিকশিত করতে সক্ষম করা হয়।" লাম্বদা-বান্ধব পদ্ধতিগুলি তখন ইন্টারফেস বিবর্তনের চিত্র হিসাবে উদ্ধৃত হয় ।
ব্রায়ান গয়েটজ

4
@ কার্তিক আপনি ভুল প্রশ্ন জিজ্ঞাসা করছেন! "সঠিকভাবে প্রোগ্রামটি বিশ্লেষণের জন্য সংকলকটির জন্য প্রয়োজনীয় নিরঙ্কুশতম ন্যূনতম কী কী" এর উপর ভিত্তি করে আমরা সিনট্যাক্সটি নির্বাচন করি না; আমরা "প্রোগ্রামারটির অভিপ্রায়টি কী কী আরও তাত্ক্ষণিকভাবে পাঠকদের কাছে স্পষ্ট করে তুলবে" এর ভিত্তিতে এটি নির্বাচন করি। আমরা প্রথমে ব্যবহারকারীদের জন্য এবং দ্বিতীয়ত সংকলকগুলির জন্য ডিজাইন করি (এবং এটি ব্যবহারকারীদের কাছে আসে, আমরা প্রথমে পড়ার জন্য এবং দ্বিতীয়ত লেখার জন্য ডিজাইন করি))
ব্রায়ান গয়েটজ

16

জাভা 8 এ একটি নতুন ধারণা চালু করা হয়েছে যার নাম ডিফল্ট পদ্ধতিগুলি। ডিফল্ট পদ্ধতি হ'ল সেই পদ্ধতিগুলি যা কিছু ডিফল্ট বাস্তবায়ন করে এবং বিদ্যমান কোডটি না ভেঙে ইন্টারফেসগুলি বিকশিত করতে সহায়তা করে। একটি উদাহরণ তাকান আসুন:

 public interface SimpleInterface {
    public void doSomeWork();

    //A default method in the interface created using "default" keyword

    default public void doSomeOtherWork(){

    System.out.println("DoSomeOtherWork implementation in the interface");
       }
    }

 class SimpleInterfaceImpl implements SimpleInterface{

  @Override
  public void doSomeWork() {
  System.out.println("Do Some Work implementation in the class");
   }

 /*
  * Not required to override to provide an implementation
  * for doSomeOtherWork.
  */

 public static void main(String[] args) {
   SimpleInterfaceImpl simpObj = new SimpleInterfaceImpl();
   simpObj.doSomeWork();
   simpObj.doSomeOtherWork();
      }
   }

এবং আউটপুটটি হ'ল:


ইন্টারফেসে ডোসোমোথর ওয়ার্ক বাস্তবায়নে ক্লাসে কিছু কাজের বাস্তবায়ন করুন


16

অন্যান্য উত্তরে যা কিছু উপেক্ষা করা হয়েছিল তা হ'ল টীকাতে এর ভূমিকা। জাভা 1.5 হিসাবে অনেক পিছনে, মূলশব্দটি একটি টীকা ক্ষেত্রের জন্য একটি ডিফল্ট মান সরবরাহdefault করার উপায় হিসাবে আসে about

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Processor {
    String value() default "AMD";
}

ইন্টারফেসে একজনকে ডিফল্ট পদ্ধতি নির্ধারণের জন্য জাভা 8 প্রবর্তনের সাথে এটির ব্যবহার ওভারলোড হয়েছিল ।

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


3

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

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

interface Test {
    default double getAvg(int avg) {
        return avg;
    }
}
class Tester implements Test{
 //compiles just fine
}

ইন্টারফেস টেস্ট ডিফল্ট কীওয়ার্ড ব্যবহার করে যা ইন্টারফেসটি ক্লাসগুলিতে যে পদ্ধতিগুলি ইন্টারফেস ব্যবহার করে সেগুলি প্রয়োগ করার প্রয়োজন ছাড়াই পদ্ধতির একটি ডিফল্ট বাস্তবায়ন সরবরাহ করতে দেয়।

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

তথ্য ও বিধিনিষেধসমূহ:

1-মে শুধুমাত্র একটি ইন্টারফেসের মধ্যে ঘোষণা করা হয় কোনও শ্রেণি বা বিমূর্ত শ্রেণীর মধ্যে নয়।

2-একটি শরীর সরবরাহ করা আবশ্যক

3-এটি কোনও ইন্টারফেসে ব্যবহৃত অন্যান্য সাধারণ পদ্ধতি হিসাবে প্রকাশ্য বা বিমূর্ত বলে ধরে নেওয়া হয় না।


3

একটি ইন্টারফেসের ডিফল্ট পদ্ধতিগুলি আমাদের পুরানো কোডটি না ভেঙে নতুন কার্যকারিতা যুক্ত করার অনুমতি দেয়।

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

জাভা 8 দিয়ে, আমরা defaultপদ্ধতিটি প্রয়োগের আগে কীওয়ার্ডটি ব্যবহার করে নতুন পদ্ধতির জন্য ডিফল্ট বাস্তবায়ন যুক্ত করতে পারি ।

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

উদাহরণ

public interface YourInterface {
    public void doSomeWork();

    //A default method in the interface created using "default" keyword
    default public void doSomeOtherWork(){

    System.out.println("DoSomeOtherWork implementation in the interface");
       }
    }

    class SimpleInterfaceImpl implements YourInterface{

     /*
     * Not required to override to provide an implementation
     * for doSomeOtherWork.
     */
      @Override
      public void doSomeWork() {
  System.out.println("Do Some Work implementation in the class");
   }

 /*
  * Main method
  */
 public static void main(String[] args) {
   SimpleInterfaceImpl simpObj = new SimpleInterfaceImpl();
   simpObj.doSomeWork();
   simpObj.doSomeOtherWork();
      }
   }

2

জাভা ™ টিউটোরিয়ালগুলিতে খুব ভাল ব্যাখ্যা পাওয়া গেছে , ব্যাখ্যাটির অংশটি নিম্নরূপ:

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

ডিফল্ট পদ্ধতিগুলি আপনাকে আপনার লাইব্রেরির ইন্টারফেসগুলিতে নতুন কার্যকারিতা যুক্ত করতে এবং সেই ইন্টারফেসগুলির পুরানো সংস্করণগুলির জন্য লিখিত কোডের সাথে বাইনারি সামঞ্জস্যতা নিশ্চিত করতে সক্ষম করে।


1

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

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