2012-08-01 9 views
17

अमरूद के Optional प्रकार का उपयोग कर के रूप में एक विधि का तर्क है कि आप नहीं बसOptional.absent() पासिंग तरीकों को महत्व देता concisely

// method declaration 
public void foo(Optional<String> arg); 

// compiler error 
foo(Optional.absent()); 

प्रकार निष्कर्ष की वजह से नाकाम रहने लिख सकते हैं, लेकिन इसके बजाय जोड़ने के लिए है के साथ एक समस्या स्पष्ट रूप से टाइप करें:

// real method call 
foo(Optional.<String> absent()); 

मैं इससे कैसे बच सकता हूं?

+6

वास्तव में एक बेहतर तरीका नहीं है, लेकिन एफवाईआई, 'वैकल्पिक' विधि विधि तर्क प्रकार के मुकाबले रिटर्न वैल्यू के रूप में अधिक सामान्य रूप से उपयोग किया जाता है। (यह भूलना बहुत आसान है कि किसी विधि से वापसी मूल्य आपके द्वारा लिखे गए विधि के तर्क से शून्य हो सकता है।) –

+0

एक जटिल अभिव्यक्ति के साथ, मैं एक उचित प्रकार के स्थानीय चर का उपयोग करता हूं (असाइनमेंट के आरएचएस पर कुछ और पठनीय पाने के लिए कोई प्रकार परिवर्तनीय की आवश्यकता नहीं है)। लेकिन संकल्प आने तक शायद कुछ भी नहीं किया जा सकता है (शायद जेडीके 8)। – maaartinus

+3

@LouisWasserman अभी भी 'वैकल्पिक' तर्क के रूप में उपयोग करने के लाभ हैं: 1) यह एपीआई के उपयोगकर्ताओं को स्पष्ट करता है कि एक तर्क अनुपस्थित हो सकता है; 2) इसे किसी अन्य विधि के वापसी मूल्य को पार करना आसान बनाता है। –

उत्तर

-4

बस जब प्रश्न लिखने, मैं

public class GuavaConstants { 
    @SuppressWarnings({ "raw" }) 
    public static final Optional ABSENT = Optional.absent(); 

    // similar for empty ImmutableList, etc. 
} 

और होने के बारे में सोचा तो कॉल की तरह

@SuppressWarnings({ "unchecked" }) 
foo(GuavaConstants.ABSENT); 

वहाँ एक बेहतर दृष्टिकोण है देख सकते हैं?

+16

का उपयोग करके कॉल करने की आवश्यकता है हां, 'foo (वैकल्पिक। अनुपस्थित()) बेहतर है। यह मुझे कुछ ऐसा नहीं करता है जैसा आपको करना चाहिए। – ColinD

+3

@ColinD, कृपया इसे एक उत्तर के रूप में पोस्ट करें, मैं इसे तुरंत हटा दूंगा। स्वीकार्य (और केवल) जवाब काफी बुरा है। –

7

आप Optional<> प्रकार का एक छोटा सेट (उदाहरण के लिए, ज्यादातर तार या अन्य प्रकार के एक मुट्ठी भर) के साथ काम कर रहे हैं, तो बस कुछ सहायक तरीकों कि आप के लिए प्रकार तर्क बाँध बनाने के लिए:

public final class AbsentValues { 
    public static Optional<String> absentString() { 
     return Optional.<String>absent(); 
    } 
} 

आप कर सकते हैं यहां तक ​​कि स्थिर इन आयात क्लीनर कोड में परिणाम की:

import static AbsentValues.*; 

... 

foo(absentString()); 

कम आम Optional<> प्रकारों के लिए, बस प्रकार तर्क स्पष्ट रूप से निर्दिष्ट। यह सुंदर नहीं हो सकता है, लेकिन यह सही है।

-1

तो, ऐसा करने का यह सही तरीका है। अगर किसी और चीज के लिए नहीं, तो मुझे कम से कम अपने भविष्य के संदर्भ के लिए यहां दिखाएं, हर किसी के लिए जो मेरे जैसे प्रश्न नहीं पढ़ता है :) कॉलिनडी (और एलेक्सी) के लिए धन्यवाद।

foo(Optional.<String>absent())