2017-08-16 14 views
6

यदि मैं कोटलिन डेटा कक्षाओं का उपयोग करके अपनी मूल्य वस्तुओं का मॉडलिंग कर रहा हूं तो सत्यापन को संभालने का सबसे अच्छा तरीका क्या है। ऐसा लगता है कि इनिट ब्लॉक एकमात्र लॉजिकल जगह है क्योंकि यह प्राथमिक कन्स्ट्रक्टर के बाद निष्पादित होता है।सत्यापन डेटा कक्षा पैरामीटर्स कोटलिन

data class EmailAddress(val address: String) { 

    init { 
     if (address.isEmpty() || !address.matches(Regex("^[a-zA-Z0-9][email protected][a-zA-Z0-9]+(.[a-zA-Z]{2,})$"))) { 
      throw IllegalArgumentException("${address} is not a valid email address") 
     } 
    } 
} 

JSR-303 उदाहरण

इस के नकारात्मक पक्ष यह है का उपयोग करते हुए लोड समय बुनाई

@Configurable 
data class EmailAddress(@Email val address: String) { 

    @Autowired 
    lateinit var validator: Validator 

    init { 
     validator.validate(this) 
    } 
} 
+0

मैं हमेशा अपना पहला उदाहरण की तरह कुछ किया है इस तरह के साथ काम करने में असहज हो जाएगा, लेकिन मैं सिर्फ एक स्पष्ट 'validate' विधि डाल दिया और इसे नियंत्रक से कॉल करें (उदाहरण के लिए, इस मामले में कि मेरे पास अनुरोध ऑब्जेक्ट है जो एस द्वारा पॉप्युलेट किया गया है '@ अनुरोधबॉडी' के रूप में प्रिंग बूट और मैं इनपुट को प्रमाणित करना चाहता हूं। – Kevin

उत्तर

0

वास्तव में, ऐसा लगता है कि यह है कि सत्यापन के डेटा वर्गों में से एक जिम्मेदारी नहीं है की आवश्यकता है। data खुद के लिए बताता है - इसका उपयोग डेटा संग्रहण के लिए किया जाता है।

  1. तो अगर आप डेटा वर्ग सत्यापित करना चाहते हैं, यह निर्माता के तर्कों पर @get: सत्यापन की स्थापना की और कक्षा में डेटा वर्ग के बाहर मान्य, निर्माण के लिए जिम्मेदार करने के लिए उपयुक्त मतलब होगा। आप प्रोटोटाइप के साथ इस वर्ग बीन कर सकते हैं -

  2. आपका दूसरा विकल्प डेटा वर्ग का उपयोग नहीं करने के लिए, बस साधारण क्लास का उपयोग करें और

  3. इसके अलावा निर्माता सत्यापनकर्ता वहाँ पारित करने में पूरे तर्क लागू, अगर आप स्प्रिंग फ्रेमवर्क का उपयोग करें गुंजाइश है, लेकिन संभावना यह बिल्कुल स्पेगेटी-कोड :)

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