2011-06-16 6 views
12

अधिकांश समय, एक वर्ग के लिए एक निर्माता अपने तर्क मानों को लेकर उदाहरण चर सेट करने के लिए उन्हें इस्तेमाल से ज्यादा कुछ नहीं करता है:एक भी स्काला निर्माता है कि सेट चर की तुलना में अधिक होता है को लागू करने

// Java 
public class MyClass { 
    private int id; 

    public MyClass(int id) { 
     this.id = id; 
    } 
} 

तो मैं समझता हूँ स्काला के डिफ़ॉल्ट निर्माता वाक्य रचना की दक्षता में ... बस वर्ग के नाम के बगल में कोष्ठक में चरों की सूची की घोषणा:

// Scala 
class MyClass(id: int) { 
} 

हालांकि, उन परिस्थितियों जहाँ आप एक निर्माता की जरूरत के बारे में वास्तव में बस प्लग से काम करना, के अलावा इंस्टान में तर्क सीई चर?

// Java 
public class MyClass { 
    private String JDBC_URL = null; 
    private String JDBC_USER = null; 
    private String JDBC_PASSWORD = null; 

    public MyClass(String propertiesFilename) { 
     // Open a properties file, parse it, and use it to set instance variables. 
     // Log an error if the properties file is missing or can't be parsed. 
     // ... 
    } 
} 

यह स्कैला में कैसे काम करता है? मैं तो इस तरह निर्माता के लिए एक कार्यान्वयन परिभाषित करने की कोशिश कर सकते हैं:

// Scala 
class MyClass(propertiesFilename: String) { 
    def this(propertiesFilename: String) { 
    // parse the file, etc 
    } 
} 

... लेकिन मैं एक संकलन त्रुटि मिलती है, शिकायत है कि निर्माता दो बार परिभाषित किया गया है।

मैं नो-एर्ग डिफॉल्ट कन्स्ट्रक्टर होने के बाद इस संघर्ष से बच सकता हूं, और फिर उपर्युक्त माध्यमिक कन्स्ट्रक्टर के रूप में घोषित कर सकता हूं। हालांकि, परिस्थितियों के बारे में क्या आपको वास्तव में "एक-और-केवल-एक" कन्स्ट्रक्टर की आवश्यकता है, और आपको सामान करने की आवश्यकता है?

उत्तर

19

आप इन कार्यों को केवल कक्षा निकाय में कर सकते हैं।

Class Foo(filename: String) { 
    val index = { 
     val stream = openFile(filename) 
     readLines(stream) 
     ... 
     someValue 
    } 
    println(“initialized...“) 
} 
+0

दोह की सुविधा के लिए भुगतान करने के लिए यह एक छोटी सी कीमत है! धन्यवाद, मैं धीरे-धीरे वहां जा रहा हूं ... –

3

किसी भी कोड तुम वर्ग के शरीर में डाल निर्माण

class MyClass(propertiesFileName: String) { 
    println("Just created an instance of MyClass with properties in " + propertiesFileName) 
    val myFavoriteProperty = retrieveFavoriteFrom(propertiesFileName) 
} 

यह थोड़ा अजीब हो सकता है पर निष्पादित किया जाता है और यह निश्चित रूप से एक अच्छा विचार है अपने सदस्य घोषणा करने और अपने प्रारंभ बिछा के लिए नहीं है बहुत कुछ कोड, लेकिन परिवर्तनीय प्रारंभिक वाक्यविन्यास

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