2011-01-31 16 views
12

स्कैला में निम्न जावा कोड का अनुवाद कैसे किया जाएगा?स्कैला इंस्टेंस चर सबसे अच्छा अभ्यास

class ClassA { 
    private int field1; 
    private int field2; 

    public ClassA() { 
     field1 = 1; 
     field2 = 2; 
    } 
} 

मैं दो विकल्प देख सकते हैं:

class ClassA(val field1: Int, val field2: Int) { 
    .... 
} 

या

class ClassA { 
    val field1: Int = 1 
    val field2: Int = 2 
} 

क्या सिफारिश की है, और क्यों?

+0

कोई भी संस्करण समकक्ष नहीं है, क्योंकि दोनों फ़ील्ड जावा संस्करण में निजी हैं और आपके द्वारा दिखाए गए स्कैला विकल्पों में सार्वजनिक हैं। शायद आप जो हासिल करना चाहते हैं उसके बारे में अधिक विशिष्ट होना चाहते हैं? –

उत्तर

4

यदि आप निजी फ़ील्ड रखना चाहते हैं, तो उन्हें निजी घोषित क्यों न करें?

class ClassA { 
    private val field1: Int = 1 
    private val field2: Int = 2 
} 
5

दोनों के बीच सबसे बड़ा अंतर यह है कि वर्ग पैरामीटर को कन्स्ट्रक्टर के रूप में उपयोग किया जा सकता है। यदि आप चाहते हैं कि कन्स्ट्रक्टर के पास आपके जावा उदाहरण के रूप में कोई पैरामीटर नहीं है, तो आपको दूसरे को उपयोग करने की आवश्यकता है, साथ ही @Debilski द्वारा सुझाए गए अनुसार निजी संशोधक जोड़ना होगा।

एक और विकल्प कन्स्ट्रक्टर में डिफ़ॉल्ट पैरामीटर का उपयोग करना होगा। इस तरह खेतों यदि आवश्यक हो तो बदला जा सकता है:

class ClassA (private val field1: Int = 1, private val field2: Int = 2) 

// Using defaults 
val a = new ClassA 

// Setting new values 
val b = new ClassA(3, 4) 
+0

यह एक अच्छा समाधान है, लेकिन ओपी के जावा कोड के बराबर नहीं है। – Raphael

+0

@ राफेल यह सच है। लेकिन जैसा कि दिया गया जावा उदाहरण खुद में बहुत व्यर्थ लगता है, मैंने सोचा कि शायद कुछ विकल्प दिखाए जा सकते हैं दिलचस्प :) – eivindw

1

आप हमेशा कि फ़ील्ड 1 चाहते हैं और field2 वर्ग एक के प्रत्येक उदाहरण के लिए एक ही मूल्य है, तो मैं उन्हें एक साथी मॉड्यूल में डाल करने के लिए सुझाव है:

object A { 
    private val field1 = 1 
    private val field2 = 2 
} 

और फिर उन्हें कक्षा एक में उपयोग करें:

class A { 
    def complexInternalComputation = 2*A.a 
} 

या इस तरह से:

class A { 
    import A._ 
    def complexInternalComputation = 2*a 
} 
+0

यह काम नहीं करता है; 'ए 'को कक्षा' ए' के उदाहरण से निजी नहीं किया जा सकता है क्योंकि यह निजी है। – Raphael

+0

स्कैला विनिर्देश से, §5.2: • निजी मोडिफ़ाई का उपयोग किसी टेम्पलेट में किसी भी परिभाषा या घोषणा के साथ किया जा सकता है। ऐसे सदस्यों को केवल सीधे संलग्न टेम्पलेट और उसके साथी मॉड्यूल या साथी वर्ग (§5.4) के भीतर से पहुंचा जा सकता है। – Nicolas

+0

हालांकि, यह आरईपीएल में विफल रहता है लेकिन यह एक फाइल में काम करता है। – Nicolas

16

वहाँ जावा से स्काला करने के लिए कोई आसान अनुवाद, यह निर्भर करता है संदर्भ पर है:

  • चर जावा में परिवर्तनशील हैं? यदि हां (अन्यथा वे जावा में अंतिम होना चाहिए): क्या उन्हें स्कैला में अपरिवर्तनीय बनाने के लिए समझदारी होगी?
  • क्या निर्माता स्कैला में सार्वजनिक रहना चाहिए? एक कारखाना होगा (उदाहरण के लिए साथी वस्तु में एक लागू विधि) अधिक अनुचित?
  • क्यों वैरिएबल निजी हैं? क्या उनके पास गेटर्स और/या सेटर्स हैं?
  • चर की आवश्यकता कब होती है, क्या उन्हें आलसी बनाने के लिए समझदारी होगी?
  • यदि मान अपरिवर्तनीय और उजागर हैं, तो क्या वे पैटर्न मिलान में उपयोगी होंगे? क्या एक केस क्लास सही विकल्प होगा?
  • एपीआई और एक्सेस को सरल बनाने के लिए चर को समूहीकृत किया जा सकता है (उदा। एक टुपल में)?

आप देखते हैं, बहुत सारे विचार हैं। मैं स्कैला की संभावनाओं के बारे में जानने और विभिन्न दृष्टिकोणों के साथ खेलने के लिए सुझाव दूंगा, अन्यथा आप आवश्यकतानुसार "बेहतर जावा के रूप में स्केल" में फंस जाएंगे।

class ClassA{ 
    private var field1 = 1 
    private var field2 = 2 
} 

नोट var बजाय val का उपयोग:

8

यह स्काला के सबसे सीधा अनुवाद है। val जावा में public final के अनुरूप एक अपरिवर्तनीय फ़ील्ड है। इस प्रकार इसे बाद में बदला नहीं जा सकता है और किसी दिए गए उदाहरण के लिए सही मूल्य पर ऐसे क्षेत्र को शुरू करने का एक तरीका प्रदान करना महत्वपूर्ण है।

यह तय करने के लिए कि आप क्या उपयोग करना चाहते हैं, आपको अपने आप को लैंडेई के उत्तर में सूचीबद्ध प्रश्न पूछना चाहिए।

+0

काफी प्रत्यक्ष अनुवाद नहीं - जावा निजी चर वर्ग निजी हैं, उदाहरण के लिए निजी नहीं है, इसलिए आपको [यह] छोड़ना चाहिए। – Submonoid

+0

@Submonoid धन्यवाद। ऐसा लगता है कि मैंने हमेशा इसे गलत किया है। :) – ziggystar

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