दिलचस्प पोस्ट
प्रवेश कुंजी के साथ फार्म जमा रोकें स्थैतिक चर थ्रेड्स के बीच साझा किए गए हैं? वेबब्रोवर नियंत्रण में स्ट्रिंग HTML सामग्री को कैसे प्रदर्शित किया जाए? फ़ंक्शन कॉल और फ़ंक्शन संदर्भ में क्या अंतर है? यदि कोई मार्कर इंटरफ़ेस में कोई तरीका नहीं है, तो यह कैसे काम करता है? एसएसएल और मैन-इन-द-मध्य गलतफहमी मैं परिवर्तनों के लिए एक फाइल कैसे देखूं? जब (यदि कभी) eval नहीं बुराई है? पायथन – स्क्रिप्ट को सिस्टम में इंस्टॉल करें विरोधी जालीकरण टोकन उपयोगकर्ता के लिए "" है लेकिन वर्तमान उपयोगकर्ता "उपयोगकर्ता नाम" मैं टीएफएस स्रोत नियंत्रण से एक विशिष्ट फाइल कैसे निकाल सकता हूं डाउनलोड करने के लिए phpexcel चेतावनी: संपत्ति 'स्रोत' को 'org.eclipse.jst.jee.server: appname' को सेट करना एक मिलान संपत्ति नहीं पाया डाक से res.redirect कैसे एक ही सर्वर या अलग सर्वर से आ रहा है अगर एक अनुरोध की जांच करने के लिए?

जावा में फंक्शन पॉइंटर

यह कुछ सामान्य और तुच्छ हो सकता है, लेकिन मुझे ठोस जवाब खोजने में परेशानी होती है। सी # में प्रतिनिधियों की एक अवधारणा है, जो सी ++ से फ़ंक्शन पॉइंटर्स के विचार के लिए दृढ़ता से संबंधित है क्या जावा में एक समान कार्यक्षमता है? यह देखते हुए कि संकेतक कुछ अनुपस्थित हैं, इस बारे में सबसे अच्छा तरीका क्या है? और स्पष्ट होने के लिए, हम पहले कक्षा में बात कर रहे हैं।

Solutions Collecting From Web of "जावा में फंक्शन पॉइंटर"

फ़ंक्शन-पॉइंटर-जैसी कार्यक्षमता के लिए जावा मुहावरे एक इंटरफ़ेस को लागू करने वाला गुमनाम वर्ग है, जैसे

 Collections.sort(list, new Comparator<MyClass>(){ public int compare(MyClass a, MyClass b) { // compare objects } }); 

अद्यतन: उपरोक्त Java संस्करणों में जावा 8 से पहले आवश्यक है। अब हमारे पास बहुत अच्छे विकल्प हैं, अर्थात् लैंबदास:

 list.sort((a, b) -> a.isGreaterThan(b)); 

और विधि संदर्भ:

 list.sort(MyClass::isGreaterThan); 

आप एक इंटरफ़ेस के साथ फ़ंक्शन पॉइंटर को बदल सकते हैं। कहें कि आप एक संग्रह के माध्यम से भाग लेना चाहते हैं और प्रत्येक तत्व के साथ कुछ करना चाहते हैं।

 public interface IFunction { public void execute(Object o); } 

यह वह इंटरफ़ेस है जिसे हम कह सकते हैं कि संग्रह यूटील्स 2.डोफंक (संग्रह सी, आईफ़ंक्शन एफ)।

 public static void doFunc(Collection c, IFunction f) { for (Object o : c) { f.execute(o); } } 

उदाहरण के तौर पर कहते हैं कि हमारे पास संख्याओं का संग्रह है और आप 1 से प्रत्येक तत्व जोड़ना चाहते हैं।

 CollectionUtils2.doFunc(List numbers, new IFunction() { public void execute(Object o) { Integer anInt = (Integer) o; anInt++; } }); 

आप इसे करने के लिए प्रतिबिंब का उपयोग कर सकते हैं
पैरामीटर को ऑब्जेक्ट और विधि का नाम (स्ट्रिंग के रूप में) के रूप में पास करें और फिर विधि को खोलें। उदाहरण के लिए:

 Object methodCaller(Object theObject, String methodName) { return theObject.getClass().getMethod(methodName).invoke(theObject); // Catch the exceptions } 

और फिर इसे इस रूप में प्रयोग करें:

 String theDescription = methodCaller(object1, "toString"); Class theClass = methodCaller(object2, "getClass"); 

बेशक, सभी अपवादों की जांच करें और आवश्यक पट्टियां जोड़ें
मेरे बुरे अंग्रेजी से क्षमा करें
अलविदा!

नहीं, फ़ंक्शंस जावा में प्रथम श्रेणी ऑब्जेक्ट नहीं हैं I आप हेन्डलर वर्ग को लागू करके एक ही चीज़ कर सकते हैं – इस तरह से स्विंग आदि में कॉलबैक लागू होते हैं।

हालांकि जावा के भविष्य के संस्करणों में बंद होने के प्रस्ताव (आप किस बात के बारे में बात कर रहे हैं, इसका आधिकारिक नाम) – जवावर के पास एक दिलचस्प लेख है

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

समान कार्यक्षमता प्राप्त करने के लिए आप अनाम आंतरिक कक्षाओं का उपयोग कर सकते हैं।

यदि आप एक इंटरफ़ेस Foo परिभाषित करने के लिए थे:

 interface Foo { Object myFunc(Object arg); } 

एक विधि bar बनाएँ, जो एक 'फ़ंक्शन पॉइंटर' को एक तर्क के रूप में प्राप्त होगा:

 public void bar(Foo foo) { // ..... Object object = foo.myFunc(argValue); // ..... } 

अंततः निम्नानुसार विधि कॉल करें:

 bar(new Foo() { public Object myFunc(Object arg) { // Function code. } } 

जावा में ऐसी कोई चीज नहीं है आपको अपने ऑब्जेक्ट को कुछ ऑब्जेक्ट में लपेटकर उस ऑब्जेक्ट के संदर्भ को पास करना होगा ताकि उस ऑब्जेक्ट पर विधि के संदर्भ को पारित किया जा सके।

Syntactically, यह कक्षा के सदस्य चर के रूप में परिभाषित में जगह या अज्ञात वर्ग परिभाषित गुम कक्षाओं का उपयोग करके कुछ हद तक आसानी हो सकता है।

उदाहरण:

 class MyComponent extends JPanel { private JButton button; public MyComponent() { button = new JButton("click me"); button.addActionListener(buttonAction); add(button); } private ActionListener buttonAction = new ActionListener() { public void actionPerformed(ActionEvent e) { // handle the event... // note how the handler instance can access // members of the surrounding class button.setText("you clicked me"); } } } 

मैंने कॉलबैक / डिलीट समर्थन को जावा में प्रतिबिंब के द्वारा लागू किया है विवरण और कार्यरत स्रोत मेरी वेबसाइट पर उपलब्ध हैं I

यह काम किस प्रकार करता है

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

प्रदर्शन के साथ मेरे लिए अब भी एक उच्च प्राथमिकता है, मैं हर आवेश के मापदंडों को पकड़ने के लिए एक फेंकने वाली ऑब्जेक्ट सरणी बनाने की आवश्यकता नहीं चाहता था – बाद में बड़ी डेटा संरचना में हजारों तत्व हो सकते हैं, और एक संदेश प्रसंस्करण में परिदृश्य हम एक दूसरे के हजारों डेटा संरचनाओं को संसाधित कर सकते हैं।

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

WithParms नेस्टेड क्लास, फिर, वैकल्पिक है और दो उद्देश्यों में कार्य करता है, इसमें कॉलबैक invocations के लिए आवश्यक पैरामीटर ऑब्जेक्ट एरे होते हैं, और यह 10 ओवरलोडेड इनवॉइस () तरीकों (1 से 10 पैरामीटर से) प्रदान करता है जो पैरामीटर सरणी को लोड करता है और फिर कॉलबैक लक्ष्य को खोलें

जावा 8 ने लैम्ब्डा और विधि संदर्भ पेश किया है। इसलिए यदि आपका फ़ंक्शन किसी कार्यात्मक इंटरफ़ेस से मेल खाता है (आप अपना खुद का बना सकते हैं) तो आप इस मामले में एक विधि संदर्भ का उपयोग कर सकते हैं।

जावा सामान्य कार्यात्मक इंटरफेस का एक सेट प्रदान करता है जबकि आप निम्न कर सकते हैं:

 public class Test { public void test1(Integer i) {} public void test2(Integer i) {} public void consumer(Consumer<Integer> a) { a.accept(10); } public void provideConsumer() { consumer(this::test1); // method reference consumer(x -> test2(x)); // lambda } } 

क्लोजर की जांच करें कि उन्हें लैम्ब्डाज लाइब्रेरी में कैसे कार्यान्वित किया गया है। वे वास्तव में सी # प्रतिनिधि के समान व्यवहार करते हैं:

http://code.google.com/p/lambdaj/wiki/Closures

यहां पर अधिकांश लोगों के लिए रिश्तेदार मैं जावा के लिए नया हूँ लेकिन जब से मैंने ऐसा कोई सुझाव नहीं देखा है तो मुझे सुझाव देने के लिए एक और विकल्प है। मुझे यकीन नहीं है कि यह एक अच्छा अभ्यास है या नहीं, या यहां तक ​​कि पहले सुझाया गया है और मुझे यह नहीं मिला। मैं इसे पसंद करता हूं क्योंकि मुझे लगता है कि यह स्वयं वर्णनात्मक है।

  /*Just to merge functions in a common name*/ public class CustomFunction{ public CustomFunction(){} } /*Actual functions*/ public class Function1 extends CustomFunction{ public Function1(){} public void execute(){...something here...} } public class Function2 extends CustomFunction{ public Function2(){} public void execute(){...something here...} } ..... /*in Main class*/ CustomFunction functionpointer = null; 

फिर आवेदन के आधार पर, असाइन करें

  functionpointer = new Function1(); functionpointer = new Function2(); 

आदि।

और फोन करके

  functionpointer.execute();