2011-05-25 23 views
7

के लिए वैल या ऑब्जेक्ट आमतौर पर कौन सा समाधान सामान्य रूप से पसंद किया जाना चाहिए, इस पर विचार करना कि परिवर्तन स्रोत संगत है?अपरिवर्तनीय, अंतिम सिंगलटन ऑब्जेक्ट

यह

object Foo { 
    val Bar = new Baz(42, "The answer", true) 
} 

या है?

object Foo { 
    object Bar extends Baz(42, "The answer", true) 
} 
+0

मैं कहूंगा कि अगर आप भविष्य में अपने एपीआई को बहुत अधिक संशोधन के बिना अलग-अलग मॉड्यूलर करना चाहते हैं तो बेहतर होगा ... लेकिन चूंकि परिवर्तन स्रोत संगत है, इसलिए आप आवश्यक होने तक दूसरा स्थान रख सकते हैं। –

+0

[स्केल क्लास के अंदर वैल और ऑब्जेक्ट का संभावित डुप्लिकेट?] (Http://stackoverflow.com/questions/3448691/val-and-object-inside-a-scala-class) – Bergi

उत्तर

8

दो संरचनाओं के बीच कार्यात्मक अंतर यह है कि object Bar केवल तभी बनाया जाता है जब इसकी आवश्यकता होती है, जबकि val Barobject Foo का उपयोग किया जाता है। एक व्यावहारिक मामले के रूप में, इसका मतलब है कि यदि आप दायीं तरफ महंगे हैं और हमेशा इसकी आवश्यकता नहीं होगी तो आपको ऑब्जेक्ट (या lazy val) का उपयोग करना चाहिए। अन्यथा, val शायद आसान है।

इसके अलावा, ध्यान दें कि यदि वर्ग Baz अंतिम है, तो आप object शैली का उपयोग करने के बाद से आप Baz विस्तार नहीं कर सकते (लेकिन तब भी lazy val उपयोग कर सकते हैं यदि आप निर्माण को स्थगित करने जब तक यह आवश्यक है चाहते हैं) में सक्षम नहीं होगा ।

+0

क्षमा करें, मैं पर्याप्त स्पष्ट नहीं था । मेरा मतलब था 'अंतिम' के साथ कि परिवर्तनीय 'बार' को फिर से सौंप दिया नहीं जाएगा। 'ऑब्जेक्ट' के लिए बाइटकोड 'आलसी वाल' के कोड के मुकाबले थोड़ा आसान नहीं है? – soc

+0

@soc - हां, 'आलसी वाल' अधिक जटिल कोड (और थ्रेडसेफ) है। और मैंने अपने जवाब को स्पष्ट करने के लिए संपादित किया कि मेरा मतलब 'अंतिम' के संबंध में क्या था। –

+0

'ऑब्जेक्ट' थ्रेड-सुरक्षित भी नहीं होना चाहिए? – soc

2

मैं के बाद से दूसरे में, आप एक नया वर्ग पैदा कर रहे पहले कहते हैं, लेकिन किसी भी जानकारी (तरीकों, मूल्यों या नए का कोई अधिभावी) न जोड़ें।