2012-04-03 15 views
16

ऐप्पल ऑब्जेक्टिव-सी भाषा की एक विशेषता है जो वास्तव में मेरे लिए उपयोगी है: मैं कोड ब्लॉक को विधियों में तर्क के रूप में पास कर सकता हूं।ऑब्जेक्टिव सी जावा समकक्ष

मैं जावा में भी ऐसा करना चाहता हूं। कुछ की तरह:

myManager.doSomethingInTransaction(function() { 
    dao.save(); 
}); 

तो myManager वस्तु एक startTransaction() और एक endTransaction() तरीकों के बीच मेरी कोड निष्पादित करेंगे।

क्या जावा में इसे पाने का कोई तरीका है?

+0

सरल जवाब है "नहीं", वहाँ है कि जावा में की तरह कोई सुविधा है। –

+0

2014 के लिए, उत्तर "केवल एक रननेबल का उपयोग करें" लगता है। – Fattie

उत्तर

40

दुर्भाग्यवश, जावा इसका समर्थन नहीं करता है। लेकिन आप अज्ञात वर्गों के साथ समान कार्यक्षमता प्राप्त कर सकते हैं।

ऐसा करने के लिए, सबसे पहले आपको एक इंटरफेस को परिभाषित:

interface TransactionAction { 
    public void perform(); 
} 

doSomethingInTransaction तो एक तर्क के रूप में एक TransactionAction लेने के लिए परिभाषित किया जाना चाहिए।

तब, जब आप इसे कहते हैं, ऐसा करते हैं:

myManager.doSomethingInTransaction(new TransactionAction() { 
    public void perform() { 
     dao.save(); 
    } 
}); 
+1

यह उदाहरण काम नहीं करेगा क्योंकि 'do' एक कीवर्ड है। – Landei

+0

हाँ, बस उस पर ध्यान दिया। – Taymon

+0

धन्यवाद। यह इससे स्पष्ट नहीं हो सकता है! :) –

11

कोई इस जावा (अभी तक) में मौजूद नहीं है। एक भी विधि क्या करेंगे साथ

myManager.doSomethingInTransaction(new Runnable() { 
    public void run() { 
     dao.save(); 
    } 
}); 

या किसी इंटरफ़ेस: एक वैकल्पिक हल Runnable इंटरफ़ेस का उपयोग करने के लिए है।

+0

यह सबसे अच्छा समाधान है! –

3

आप की तरह

interface CodeBlock { 
    void execute(); 
} 

एक अंतरफलक का उपयोग कर सकते समारोह की तरह

someType functionToBeExecuted(CodeBlock cb) { 
    ... 
} 

लगेगा यह

functionToBeExecuted(new CodeBlock() { 
    void execute() { 
     // blah 
    } 
}); 

की तरह कहा जा सकता है लेकिन अगर अपने कोड का उपयोग करने के लिए सक्षम होना चाहिए चर या फ़ील्ड में अधिक विशिष्ट होगा। नए ऑब्जेक्ट्स के कारण भी प्रदर्शन कम हो जाएगा।

2

यह एक लैम्ब्डा अभिव्यक्ति का उपयोग कर जावा 8 में संभव है:

myManager.doSomethingInTransaction(() -> { 
    dao.save(); 
}); 

या अधिक ने संक्षेप में:

myManager.doSomethingInTransaction(() -> dao.save()); 

doSomethingInTransaction का आपका कार्यान्वयन एक Runnable पैरामीटर, या किसी अन्य एकल विधि को स्वीकार करना चाहिए एक मिलान विधि हस्ताक्षर के साथ इंटरफ़ेस।

आप यहाँ Oracle की प्रलेखन पा सकते हैं: https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

+2

इसे 'myManager.doSomethingInTransaction (दाओ :: सेव) में भी सरलीकृत किया जा सकता है; ' – Palle