2013-02-25 24 views
6

जावा में function objects (एक ऐसी ऑब्जेक्ट जो निर्यात करता है जो अन्य ऑब्जेक्ट्स पर काम करता है) बनाने का सबसे अच्छा अभ्यास क्या है?जावा में फ़ंक्शन ऑब्जेक्ट्स को निर्यात करने का सबसे अच्छा अभ्यास क्या है?

+1

आप 'Comparator' इंटरफेस को देखकर कुछ प्रेरणा मिल सकता है: http://docs.oracle.com/javase/6/docs /api/java/util/Comparator.html। यह एक खुला अंत प्रश्न है। –

+2

संभव डुप्लिकेट [जावा में फ़ंक्शन पॉइंटर के लिए निकटतम विकल्प क्या है?] (Http://stackoverflow.com/questions/122407/whats-the-nearest-substitute-for-a-function-pointer-in-java) – Raedwald

उत्तर

5

यह forthcoming Java 8 functional interfaces

जावा 8 वर्ग पुस्तकालय को देखने के लिए शिक्षाप्रद है एक नए पैकेज, java.util.functions, जो कई नए कार्यात्मक इंटरफेस शामिल है। इनमें से कई को संग्रह API के साथ का उपयोग किया जा सकता है।

यदि आप यहां प्रदर्शित पैटर्न का पालन करते हैं, तो आपके पास एक कार्यात्मक इंटरफेस (एक विधि का समर्थन करने वाला इंटरफ़ेस) होगा और कोई सदस्य नहीं होगा। आपके फ़ंक्शन ऑब्जेक्ट को विधि तर्कों पर किसी भी विधि को कॉल नहीं करना चाहिए जो उनके राज्य को बदल सकता है (यानी साइड इफेक्ट्स प्रदर्शित करता है)। दुर्भाग्यवश आप इसे लागू नहीं कर सकते - आपको इसके लिए सम्मेलन पर भरोसा करना है।

+0

क्या इसे कार्यात्मक भाषाओं के साथ लागू किया जा सकता है? – Geek

+0

मुझे विश्वास है कि अपरिवर्तनीयता लागू करने वाली भाषाएं इसे लागू कर सकती हैं। शायद सी ++ और इसके मजबूत कॉन्स अर्थशास्त्र, हालांकि मैं इस पर उद्धृत नहीं करना चाहूंगा! –

3

जावा एक ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग भाषा है, इसलिए रणनीति डिजाइन पैटर्न का उपयोग करें।

+1

जबकि रणनीतियां यहां काम करती हैं, केवल एक विधि को लागू करने के लिए एक रणनीति वस्तु की आवश्यकता नहीं होती है, क्योंकि एक कार्यात्मक वस्तु की आवश्यकता होती है –

2

जावा 8 में कार्यात्मक इंटरफेस कार्यान्वयन के निर्माण को कम करने के लिए लैम्ब्डा होना चाहिए। Java8 इससे पहले कि आप क्या अमरूद पुस्तकालय प्रस्तावों पर विचार कर सकता: समारोह है, जो है एक विधि बी लागू होते हैं:

अमरूद दो बुनियादी "कार्यात्मक" इंटरफेस प्रदान करता है: Functional Explained

यहाँ प्रलेखन का एक अंश है (एक इनपुट)। फ़ंक्शन के उदाहरण आमतौर पर पारदर्शी रूप से पारदर्शी होने की अपेक्षा की जाती हैं - कोई साइड इफेक्ट्स नहीं - और बराबर के साथ संगत होने के लिए, यानी, असमान (बी) का अर्थ है कि function.apply (a) .equals (function.apply (b))। पूर्वानुमान, जिसमें एकल विधि बूलियन लागू होता है (टी इनपुट)। भविष्यवाणी के उदाहरण आम तौर पर साइड-इफेक्ट-फ्री और बराबर के साथ संगत होने की उम्मीद है।

0

टिप्पणी के बाद ठीक है, यहां एक उत्तर है: कोई फ़ंक्शन पास करने का कोई आसान/सुविधाजनक तरीका नहीं है।

अधिकांश समय

आप एक आंतरिक वर्ग जो उदाहरण के लिए की तरह एक अंतरफलक को लागू करता घोषणा करेंगे, Comparator: http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html

तथ्य यह है कि कार्यों पारित नहीं किया जा सकता है के रूप में मानकों तथाकथित डिजाइन पैटर्न का एक बहुत को जन्म दिया , जहां आप वस्तुओं के वर्ग/इंटरफेस के आसपास गुजरते हैं जो उन कार्यों को घोषित करते हैं।

दूसरों जीवन ने उल्लेख किया जावा 8. साथ थोड़ा आसान हो जाएगा