2015-03-13 4 views
5

मैंने जावा 8 में Optional (दुर्भाग्य से मुझे याद नहीं है) के उद्देश्य के बारे में कुछ पढ़ा है, और मुझे आश्चर्य हुआ कि लेखक ने कक्षा में एक विशेषता के रूप में Optional के उपयोग का उल्लेख नहीं किया है।क्या कक्षा में एक विशेषता के रूप में वैकल्पिक का उपयोग करने के लिए यह एक अच्छा अभ्यास है?

चूंकि मैं अपने वर्गों में अक्सर विकल्प का उपयोग कर रहा हूं, इसलिए मैं सोच रहा था कि यह एक अच्छा अभ्यास है या नहीं। या क्या मैं बेहतर सामान्य गुणों का उपयोग कर सकता हूं, जो सेट नहीं होने पर null लौटाते हैं?

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

उदाहरण

मैं स्पष्ट करने के लिए एक उदाहरण देना चाहते हैं। मैं एक वर्ग Transaction है, जो इस तरह बनाया गया है है:

public class Transaction { 

    private Optional<Customer> = Optional.empty(); 
    .... 

बनाम

public class Transaction { 

    private Customer = null; 
    .... 

जब एक Customer की जाँच कर, मुझे लगता है कि यह सबसे transaction.getCustomer() != null से transaction.getCustomer().isPresent() उपयोग करने के लिए तार्किक है। मेरी राय में पहला कोड दूसरे की तुलना में क्लीनर है।

+0

@AdamSiemion क्या हम यहां गुवा के 'वैकल्पिक' या जावा 8 के 'वैकल्पिक' के बारे में बात कर रहे हैं? – Jesper

+0

@AdamSiemion लिंक के लिए धन्यवाद! मैं अनुभवी नहीं हूं इसलिए पता नहीं था कि गुवा के पास पहले से ही था। हालांकि, उल्लेख किया गया मुख्य कारण यह है कि 'वैकल्पिक' में तीन संभावनाएं हैं: वर्तमान, अनुपस्थित और शून्य। जावा 8 अब और अनुपस्थित है, इसलिए तर्क अब मान्य नहीं है .. – bashoogzaad

+0

@bashoogzaad चाहे तीन (शून्य, अनुपस्थित, वर्तमान) या दो विकल्प (शून्य/खाली, वर्तमान) हैं, यह 'वैकल्पिक' का उद्देश्य नहीं बदलता है । –

उत्तर

14

जावा 8 के Optional मुख्य रूप से Optional in Java SE 8 में वर्णित है, जावा वर्गों के गुणों के लिए नहीं तरीकों से लौटने के मूल्यों, और के लिए गया था:

बेशक

, लोगों को वे क्या चाहते हैं कर सकते हैं। लेकिन इस सुविधा को जोड़ने के दौरान हमारे पास स्पष्ट मंशा था, और यह सामान्य उद्देश्य नहीं होना चाहिए Maybe या Some प्रकार, जितना अधिक लोग हमें ऐसा करने के लिए पसंद करेंगे। हमारा इरादा लाइब्रेरी विधि रिटर्न प्रकार के लिए सीमित तंत्र प्रदान करना था, जहां "परिणाम नहीं" का प्रतिनिधित्व करने के लिए स्पष्ट तरीका होना चाहिए और null का उपयोग करना ऐसी त्रुटियों के कारण होने की भारी संभावना है।

यहां कुंजी वापसी प्रकार के रूप में उपयोग पर केंद्रित है। कक्षा निश्चित रूप से जावा बीन की संपत्ति के रूप में उपयोग के लिए लक्षित नहीं है। इस पर गवाह है कि OptionalSerializable लागू नहीं करता है, जो आमतौर पर किसी ऑब्जेक्ट की संपत्ति के रूप में व्यापक रूप से उपयोग के लिए आवश्यक होता है।

+0

आपके उत्तर के लिए धन्यवाद! यह जानना वास्तव में सहायक है कि निर्माता 'वैकल्पिक' के साथ क्या इरादे रखते हैं। 'Serializable' के कार्यान्वयन के बारे में तर्क मुझे पूरी तरह से स्पष्ट नहीं है, लेकिन यह मेरी गलती है, क्योंकि मैं इसका उपयोग नहीं करता हूं। – bashoogzaad

+4

आपके द्वारा लिंक किए गए ब्लॉग के बारे में मजाकिया बात यह है कि आपके द्वारा उद्धृत हिस्सा [एक स्टैक ओवरफ्लो उत्तर] का एक उद्धरण है (http://stackoverflow.com/a/26328555/2711488) – Holger

0

मुझे लगता है कि यह एक सैद्धांतिक प्रश्न है।

वैकल्पिक मूल्यों की धारणा कार्यात्मक भाषाओं की दुनिया से लाई गई थी। वे भाषाएं आमतौर पर भाषा स्तर पर पैटर्न मिलान का समर्थन करती हैं और आपको वैकल्पिक मूल्य पर पैटर्न मिलान करने की अनुमति देती हैं।

कार्यात्मक भाषाओं में फ़ंक्शन कॉल आमतौर पर एक वैकल्पिक मान देता है जो अन्य कोड पैटर्न मिलान कर सकता है।

मैंने कभी तर्क के रूप में वैकल्पिक पास नहीं देखा है, लेकिन इसका मतलब यह नहीं है कि यह एक बुरा विचार है। हालांकि यह अजीब लग रहा है।

+0

आपके उत्तर के लिए धन्यवाद! मैं समझता हूं कि यह विशेष रूप से लैम्ब्डा अभिव्यक्तियों में उपयोगी है, और यदि मैं आपको सही ढंग से समझता हूं, तो आपको यह भी लगता है कि इसे एक विशेषता के रूप में उपयोग करना एक अच्छा अभ्यास है? – bashoogzaad

संबंधित मुद्दे

 संबंधित मुद्दे