2011-02-14 20 views
6

क्या के बराबर है स्काला में जावा कोड के नीचे:स्काला निर्माता

import java.util.Random; 

public class Bool { 

private boolean door; 
Random random = new Random(); 

Bool() { 
    this.door = random.nextBoolean(); 
} 
} 

तो जब एक नया बूल वस्तु बन जाता है, दरवाजा चर स्वचालित रूप से एक यादृच्छिक बूलियन मान मिल जाएगा।

उत्तर

11

स्कैला में, कक्षा का शरीर जावा में एक निर्माता द्वारा बुलाए गए तरीकों के बराबर है। इसलिए अपनी कक्षा निम्नलिखित कुछ ऐसा दिखाई देगा:।

import java.util.Random 

class Bool { 
    private val random = new Random 
    private val door = random.nextBoolean() 

    ... // method definitions, etc. 
} 

(ध्यान दें कि, चुनने की, क्योंकि आप अपने जावा चर final घोषित नहीं किया था बहस कर सकते हैं कि खेतों var यहाँ रों बजाय इसके अतिरिक्त होना चाहिए, अपने random क्षेत्र पैकेज संरक्षित जो एक निरीक्षण की तरह लग रहा है, और protected[pkgName] जहां pkgName के रूप में स्काला में गाया किया जाएगा वर्ग 'पैकेज के सबसे विशिष्ट घटक का नाम है)

+1

हालांकि, 'scala.util.Random' बेहतर है। :-) –

3

करीब स्केला कोड होना चाहिए:।

class Bool { 
    var random = new Random 
    private var door = random.nextBoolean 
} 

भले ही सार्वजनिक random फ़ील्ड एक अच्छा विचार न लगे।

case class MyBool(door: Boolean = Random.nextBoolean) 

यह एक निश्चित दरवाजा मूल्य के साथ MyBool का एक नया उदाहरण बनाने के लिए संभावना को खुला छोड़कर जैसे::

val x1 = MyBool() // random door 
val x2 = MyBool(true) // door set explicitly 

के बाद से केवल दो अलग हो सकता है

5

यहाँ मेरी ले है दरवाजा मूल्यों, इसे इस तरह के बजाय स्थिर वस्तुओं का उपयोग करने के, मतलब होगा:

sealed trait MyBool { 
    def door:Boolean 
} 
object MyBool { 
    case object True extends MyBool { 
    def door = true 
    } 

    case object False extends MyBool { 
    def door = false 
    } 

    def apply:MyBool = if(Random.nextBoolean) True else False 
} 

उपयोग:

val x1 = MyBool() // random door value 
val x2 = MyBool.True // explicit door value 
+0

+1 मॉड्यूलो अप्रचलित 'केस' और लाइन में 'वैल' /' var' गुम है। – Raphael

+0

क्या एक पंक्ति में सबकुछ करना संभव नहीं है? केस क्लास माईबूल (var door: Boolean = Random.nextBoolean) की तरह .. इसलिए, जब तक हम इसे तत्काल नहीं देते हैं, तो यह Random.nexBoolean है? या मैं बकवास बात कर रहा हूँ? – blackened

+1

@ राफेल: नहीं, 'केस' की निश्चित रूप से आवश्यकता है। केस क्लास कन्स्ट्रक्टर का हर तर्क स्वचालित रूप से एक सार्वजनिक 'वैल' भी होता है। साथ ही, यह 'बराबर', 'हैशकोड' और 'टूस्ट्रिंग' के साथ-साथ साथी 'लागू' और 'अनुपयोगी' विधियों के उचित कार्यान्वयन जैसे स्वचालित रूप से बहुत सारी गुड्स जोड़ता है। तो, इसे बेहतर नहीं छोड़ा जाना चाहिए। – Madoc