2012-02-07 13 views
35

मैं कन्स्ट्रक्टर तर्कों की जांच करना चाहता हूं और तर्क सेट मान्य नहीं होने पर IllegalArgumentException फेंकने से इंकार कर देता हूं (मान अपेक्षित बाधाओं में फिट नहीं होते हैं)। स्कैला में इसे कैसे कोड करें?कन्स्ट्रक्टर तर्कों की जांच कैसे करें और अपवाद फेंकें या स्कैला में एक डिफ़ॉल्ट कन्स्ट्रक्टर में दावा करें?

उत्तर

75

स्कैला में, कक्षा का पूरा शरीर आपका प्राथमिक निर्माता है, इसलिए आप वहां अपना सत्यापन तर्क जोड़ सकते हैं।

class Foo(val i: Int) { 
    require(i >= 0, "the number must be non-negative.") 
} 

एक बेहतर दृष्टिकोण एक कारखाने विधि है कि एक scalaz.Validation[String, Foo] एक फेंकने के बजाय देता है प्रदान करने के लिए हो सकता है:

scala> class Foo(val i: Int) { 
    | if(i < 0) 
    |  throw new IllegalArgumentException("the number must be non-negative.") 
    | } 
defined class Foo 

scala> new Foo(3) 
res106: Foo = [email protected] 

scala> new Foo(-3) 
java.lang.IllegalArgumentException: the number must be positive. 

स्काला एक उपयोगिता विधि require इस प्रकार आप और अधिक संक्षेप में एक ही बात लिख देता है कि प्रदान करता है अपवाद। (नोट: स्कालाज़ की आवश्यकता है)

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

class Foo private(val i: Int) 

object Foo { 
    def apply(i: Int) = { 
    if(i < 0) 
     failure("number must be non-negative.") 
    else 
     success(new Foo(i)) 
    } 
} 

// Exiting paste mode, now interpreting. 

defined class Foo 
defined module Foo 

scala> Foo(3) 
res108: scalaz.Validation[java.lang.String,Foo] = Success([email protected]) 

scala> Foo(-3) 
res109: scalaz.Validation[java.lang.String,Foo] = Failure(number must be non-negative.) 
+2

+1 अच्छा स्पष्टीकरण –

+4

पेस्ट मोड के बारे में नहीं पता था, +1 :) – wbarksdale

+0

इसका मतलब है कि स्कैला एक महान भाषा है – Pooya

15
scala> class Foo(arg: Int) { 
    | require (arg == 0) 
    | } 
defined class Foo 

scala> new Foo(0) 
res24: Foo = [email protected] 

scala> new Foo(1) 
java.lang.IllegalArgumentException: requirement failed 
+1

अच्छा! सवाल का सही जवाब क्या है। क्या आप 'आवश्यकता' काम के विवरण के बारे में विस्तार से थोड़ा (या विस्तार से लिंक) विस्तृत कर सकते हैं? –

+1

यहां 'काम की आवश्यकता' की आवश्यकता है, @ डैन-बर्टन ;-) http://pastebin.com/rJQfTCX9 यह तर्क गलत है, तो यह सिर्फ 'नया IllegalArgumentException ("आवश्यकता विफल") फेंकता है। अपवाद को फेंकने के बजाय 'आवश्यकता' का उपयोग करने का पूरा विचार स्वयं को अपने कोड को सुंदर विश्लेषण और स्थिर विश्लेषण के लिए उपयुक्त बनाना है (जो अभी तक लागू नहीं हुआ है)। – Ivan

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