जावा 8 ने कार्यात्मक इंटरफेस की अवधारणा को जोड़ा , साथ ही कई नए तरीके जो कार्यात्मक इंटरफेस लेने के लिए डिज़ाइन किए गए हैं। इन इंटरफेस के उदाहरणों को विधि संदर्भ अभिव्यक्ति (जैसे SomeClass::someMethod
) और लैम्ब्डा एक्सप्रेशन (जैसे (x, y) -> x + y
) का उपयोग करके आसानी से बनाया जा सकता है ।
एक सहकर्मी और मेरे बीच अलग-अलग राय है जब एक रूप या किसी अन्य का उपयोग करना सबसे अच्छा है (जहां इस मामले में "सबसे अच्छा" वास्तव में "सबसे पठनीय" और "सबसे अधिक मानक प्रथाओं के अनुरूप है", जैसा कि वे मूल रूप से अन्यथा हैं समकक्ष)। विशेष रूप से, इसमें वह मामला शामिल है जहां निम्नलिखित सभी सत्य हैं:
- प्रश्न में फ़ंक्शन का उपयोग एक दायरे के बाहर नहीं किया जाता है
- उदाहरण को नाम देने से पठनीयता में मदद मिलती है (उदाहरण के लिए तर्क का विरोध करना सरल है कि यह देखना आसान है कि एक नज़र में क्या हो रहा है)
- अन्य प्रोग्रामिंग कारण नहीं हैं कि एक रूप दूसरे के लिए बेहतर क्यों होगा।
इस मामले पर मेरी वर्तमान राय यह है कि एक निजी पद्धति को जोड़ना, और विधि संदर्भ द्वारा इसका संदर्भ देना बेहतर दृष्टिकोण है। ऐसा लगता है कि इस सुविधा का उपयोग करने के लिए डिज़ाइन किया गया था, और विधि नामों और हस्ताक्षरों (जैसे "बूलियन isResultInFuture (परिणाम परिणाम)" के माध्यम से क्या हो रहा है, यह स्पष्ट रूप से यह एक बुलियन लौटना कह रहा है) संवाद करने में आसान लगता है। यह निजी पद्धति को और अधिक पुन: प्रयोज्य बनाता है यदि भविष्य में वर्ग में वृद्धि उसी चेक का उपयोग करना चाहती है, लेकिन इसके लिए कार्यात्मक इंटरफ़ेस आवरण की आवश्यकता नहीं है।
मेरे सहकर्मी की प्राथमिकता में एक विधि है जो इंटरफ़ेस का उदाहरण लौटाता है (उदाहरण के लिए "परिणाम को आगे बढ़ाएं) ()"। मेरे लिए, यह महसूस करता है कि यह बिल्कुल नहीं है कि इस सुविधा का उपयोग करने का इरादा कैसे था, थोड़ा अव्यवस्थित लगता है, और ऐसा लगता है कि नामकरण के माध्यम से वास्तव में इरादे का संचार करना कठिन है।
इस उदाहरण को ठोस बनाने के लिए, यहाँ एक ही कोड है, जो विभिन्न शैलियों में लिखा गया है:
public class ResultProcessor {
public void doSomethingImportant(List<Result> results) {
results.filter(this::isResultInFuture).forEach({ result ->
// Do something important with each future result line
});
}
private boolean isResultInFuture(Result result) {
someOtherService.getResultDateFromDatabase(result).after(new Date());
}
}
बनाम
public class ResultProcessor {
public void doSomethingImportant(List<Result> results) {
results.filter(resultInFuture()).forEach({ result ->
// Do something important with each future result line
});
}
private Predicate<Result> resultInFuture() {
return result -> someOtherService.getResultDateFromDatabase(result).after(new Date());
}
}
बनाम
public class ResultProcessor {
public void doSomethingImportant(List<Result> results) {
Predicate<Result> resultInFuture = result -> someOtherService.getResultDateFromDatabase(result).after(new Date());
results.filter(resultInFuture).forEach({ result ->
// Do something important with each future result line
});
}
}
क्या कोई आधिकारिक या अर्ध-आधिकारिक दस्तावेज या टिप्पणी है कि क्या एक दृष्टिकोण अधिक पसंदीदा है, भाषा डिजाइनरों के इरादों के साथ अधिक इन-लाइन, या अधिक पठनीय है? एक आधिकारिक स्रोत को छोड़कर, क्या कोई स्पष्ट कारण हैं कि कोई बेहतर दृष्टिकोण क्यों होगा?
Object::toString
)। तो मेरा प्रश्न इस बारे में अधिक है कि क्या इस विशेष प्रकार के उदाहरण में यह बेहतर है कि मैं यहां से बाहर कर रहा हूं, क्या ऐसे उदाहरण मौजूद हैं जहां एक दूसरे से बेहतर है, या इसके विपरीत।