2010-01-07 5 views
8

मेरे पास स्कैला के बारे में यह आसान सवाल है। यह देखते हुए निम्न वर्ग परिभाषा करने के लिए है कि मैं:केवल कन्स्ट्रक्टर वैरिएबल (एसआईसी!) को केवल पढ़ने के लिए कैसे बेनकाब करें?

class Foo(var bar: Int) 

कोड जो Foo का एक उदाहरण के निर्माण के लिए bar के लिए प्रारंभिक मूल्य पारित करने में सक्षम होना चाहिए में सक्षम है। लेकिन अगर मैं bar को var के रूप में परिभाषित करता हूं तो उपयोगकर्ता रनटाइम पर अपना मान भी बदल सकता है जो मैं नहीं चाहता हूं। उपयोगकर्ता केवल bar पढ़ने में सक्षम होना चाहिए। bar स्वयं को आंतरिक रूप से संशोधित किया गया है इसलिए val कोई विकल्प नहीं है।

उत्तर

13

केवल संपत्ति के लिए केवल पढ़ने के लिए आसान है, बस संबंधित सेटटर के बिना गेटटर विधि बनाएं। एक निजी संशोधित क्षेत्र बनाना भी आसान है।

  • निर्माता परम
  • आंतरिक परिवर्तनीय क्षेत्र
  • सार्वजनिक गेटर
  • :

    आपकी सबसे बड़ी चुनौती यहाँ साझा नाम स्थान है, तो आप के लिए एक ही नाम का उपयोग करने में सक्षम होना चाहते है निजी सेटर

अफसोस की बात है, यह संभव नहीं है, और आपको प्रत्येक भूमिका के लिए एक अलग नाम की आवश्यकता है ... तो इस तरह mething:

class Bippy(bop0: Int) { 
    private[this] var privatebop = bop0 
    //privatebop is ONLY EVER used by the following getter and setter: 
    private def bop_=(x:Int) = privatebop = x 
    def bar = privatebop 
} 

आप नामित तर्कों का उपयोग के बारे में चिंतित नहीं हैं या Scaladoc में तर्क के नाम के साथ है, तो यह आगे भी छोटा किया जा सकता है:

class Bippy(private[this] var privatebop) { 
    //privatebop is ONLY EVER used by the following getter and setter: 
    private def bop_=(x:Int) = privatebop = x 
    def bop = privatebop 
} 

अद्यतन

:

साफ विधि, यकीनन, जो आप मापदंडों वापस नामित देता है ऊपर तकनीकों में से एक के साथ एक कारखाना गठबंधन करने के लिए है

object Bippy{ 
    def apply(bop: Int) = new Bippy(bop) 
} 

जिसे बाद में Bippy(42) कहा जा सकता है। नियमित कन्स्ट्रक्टर के समान ही, लेकिन new कीवर्ड के बिना।

+0

अच्छा जवाब, बहुत बहुत धन्यवाद! – Malax

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