2012-03-01 9 views
13

मैं सोच रहा था कि कौन सा अधिक कुशल है और क्यों?अमरूद इम्यूटेबललिस्ट कॉपी बनाम बिल्डर

1)

List<Blah> foo; 
... 
return ImmutableList.copyOf(foo); 

या

2)

List<Blah> foo; 
... 
return new ImmutableList.Builder<Blah>().addAll(foo).build(); 
+8

क्या आपने इसे अपनी प्रदर्शन बाधा के रूप में पहचाना है? क्योंकि जब तक आपके पास ** विशिष्ट ** कारण नहीं है, तो आप इसकी दक्षता की परवाह क्यों करते हैं, आपको अब उस पहलू को अनदेखा करना चाहिए और अधिक पठनीय (यानी पहला) का उपयोग करना चाहिए। –

+1

मैं अपने प्रोजेक्ट में अमरूद का उपयोग करना शुरू करने से पहले उत्सुक था। मुझे यकीन नहीं था कि 'सही' तरीका – user973479

+6

है यदि कोई सरल एकल-विधि-कॉल-तरीका है जो वास्तव में वही करता है जो आप चाहते हैं और ऑब्जेक्ट-निर्माण-और-दो-विधि-कॉल-तरीका करने के लिए (प्रकार का) वही बात है, तो मैं हर बार सरल चुनना चाहता हूं। –

उत्तर

28

मैं किसी भी कारण है कि तुम यहाँ बिल्डर का उपयोग करना चाहिए नहीं दिख रहा है:

  • ImmutableList.copyOf ज्यादा हैबनाने से अधिक पठनीय इस मामले में,
  • Builder सामान्य प्रकार का अनुमान लगा नहीं है और आप जब एक लाइनर के रूप में इस्तेमाल खुद के द्वारा प्रकार निर्दिष्ट करने के लिए है,
  • (डॉक्स से)ImmutableList.copyOfdoes good magic जब एक और अपरिवर्तनीय संग्रह के साथ लागू किया (वास्तव में डेटा की प्रतिलिपि जब यह इतना करने के लिए) के लिए सुरक्षित है से बचने के लिए, प्रयास करता
  • (स्रोत से)Builder#addAll invokes ArrayList जबकि copyOf पहले बनाया था से बचा जाता है किसी भी सूची बनाने की addAll शून्य और एक तत्व संग्रह (खाली अपरिवर्तनीय सूची और सिंगलटन अपरिवर्तनीय सूची क्रमशः देता है),
  • (स्रोत से)copyOf(Collection) उदाहरण पैदा नहीं करता अस्थायी ArrayList (copyOf(Iterable) और copyOf(Iterator) ऐसा नहीं करता है),
  • (के लिए स्रोत से) इसके अलावा, Builder#buildcopyOf को पहले आंतरिक रूप से आबादी वाले ArrayList पर आमंत्रित करता है, जो आपको आपके प्रश्न पर लाता है - पर Builder का उपयोग क्यों करें?

पीएस व्यक्तिगत रूप से new ImmutableList.Builder<Blah>() कन्स्ट्रक्टर के बजाय ImmutableList.builder() स्थैतिक फैक्ट्री का उपयोग करता हूं - जब Builder<Blah> को आवंटित किया जाता है तो पहले इंफ्रायर जेनेरिक प्रकार होता है जबकि बाद वाला नहीं होता है।

+0

विस्तृत स्पष्टीकरण के लिए धन्यवाद! – user973479

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