2012-11-25 14 views
10

में एक कक्षा में खेतों और मापदंडों के बीच वास्तविक अंतर है:स्काला: क्या क्या इन दो वर्गों के बीच अंतर है निर्माता

class Person { 
    var name : String = _ 
    var surname: String = _ 
} 

class Person (var name:String, var surname: String) 

नाम और उपनाम हमेशा क्लास व्यक्ति में फ़ील्ड। समान रूप से? मैं कक्षा के व्यक्ति को तुरंत चालू करने के तरीके को बदलता हूं। क्या यह सही है?

उत्तर

6

मैं एक वर्ग के दोनों संस्करणों में संकलित किया है:

public experimental.PersonV0(); 
    Code: 
    0: aload_0 
    1: invokespecial #23; //Method java/lang/Object."<init>":()V 
    4: return 
} 

public experimental.PersonV1(java.lang.String, java.lang.String); 
    Code: 
    0: aload_0 
    1: aload_1 
    2: putfield #12; //Field name:Ljava/lang/String; 
    5: aload_0 
    6: aload_2 
    7: putfield #16; //Field surname:Ljava/lang/String; 
    10: aload_0 
    11: invokespecial #24; //Method java/lang/Object."<init>":()V 
    14: return 
} 
:

class PersonV0 { 
    var name : String = _ 
    var surname: String = _ 
} 

class PersonV1 (var name:String, var surname: String) 

अंतर कंस्ट्रक्टर्स है

10

दोनों के बीच का अंतर यह है कि दूसरे मामले में, फ़ील्ड कन्स्ट्रक्टर के लिए पैरामीटर भी हैं। यदि आप पैरामीटर को val या var होने की घोषणा करते हैं, तो वे स्वचालित रूप से सार्वजनिक सदस्य बन जाते हैं। यदि आपके पास var/val नहीं है और कहीं भी वेरिएबल का उपयोग नहीं करते हैं लेकिन कन्स्ट्रक्टर में, वे सदस्य नहीं बनेंगे, यदि आप करते हैं, तो वे निजी सदस्य होंगे। यदि आप उन्हें case class es बना देंगे, तो आप पहले मामले में चर के लिए अनुपयोगी नहीं होंगे।

तो अपने प्रश्न का उत्तर देने के लिए: इस मामले में आप सही हैं, आप केवल मूल्य निर्धारित करने के तरीके को बदलते हैं।

संपादित करें:

युक्ति: यदि आप देख सकते हैं, क्या स्केला संकलक उत्पन्न करता है, अगर आप -print साथ संकलक कहते हैं, यह भी आरईपीएल के लिए काम करता है।

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