जावा 8 के साथ, एकल विधि इंटरफ़ेस को रखना काफी उपयोगी है, क्योंकि एकल विधि इंटरफेस बंद होने और "फ़ंक्शन पॉइंटर्स" के उपयोग की अनुमति देगा। इसलिए, जब भी आपका कोड एक विधि इंटरफ़ेस के विरुद्ध लिखा जाता है, तो क्लाइंट कोड एक अज्ञात वर्ग बनाने के बजाय बंद या एक विधि (जिसमें एकल विधि इंटरफ़ेस में घोषित विधि के लिए संगत हस्ताक्षर होना चाहिए) में हो सकता है। इसके विपरीत, यदि आप एक से अधिक तरीकों से एक इंटरफ़ेस बनाते हैं, तो क्लाइंट कोड में वह संभावना नहीं होगी। यह हमेशा एक कक्षा का उपयोग करना चाहिए जो इंटरफेस के सभी तरीकों को लागू करता है।
तो एक सामान्य दिशानिर्देश के रूप में, कोई कह सकता है: यदि क्लास कोड के लिए केवल एक ही विधि का खुलासा करने वाला वर्ग कुछ क्लाइंट के लिए उपयोगी हो सकता है, तो उस विधि के लिए एक विधि इंटरफ़ेस का उपयोग करना एक अच्छा विचार है। इसका एक काउंटर उदाहरण Iterator
इंटरफ़ेस है: यहां, hasNext()
विधि के बिना केवल next()
विधि होने में उपयोगी नहीं होगा। चूंकि ऐसी कक्षा होने के बाद से केवल इन विधियों में से कोई एक लागू नहीं होता है, इस इंटरफ़ेस को विभाजित करना एक अच्छा विचार नहीं है।
उदाहरण:
interface SingleMethod{ //The single method interface
void foo(int i);
}
class X implements SingleMethod { //A class implementing it (and probably other ones)
void foo(int i){...}
}
class Y { //An unrelated class that has methods with matching signature
void bar(int i){...}
static void bar2(int i){...}
}
class Framework{ // A framework that uses the interface
//Takes a single method object and does something with it
//(probably invoking the method)
void consume(SingleMethod m){...}
}
class Client{ //Client code that uses the framework
Framework f = ...;
X x = new X();
Y y = new Y();
f.consume(x); //Fine, also in Java 7
//Java 8
//ALL these calls are only possible since SingleMethod has only ONE method!
f.consume(y::bar); //Simply hand in a method. Object y is bound implicitly
f.consume(Y::bar2); //Static methods are fine, too
f.consume(i -> { System.out.println(i); }) //lambda expression. Super concise.
//This is the only way if the interface has MORE THAN ONE method:
//Calling Y.bar2 Without that closure stuff (super verbose)
f.consume(new SingleMethod(){
@Override void foo(int i){ Y.bar2(i); }
});
}
'f.consume (i -> {System.out.println (i);}) 'को संक्षेप में सारांशित किया जा सकता है:' f.consume (System.out :: println);' –