कोटलिन एंड्रॉइड में डेटा क्लास के लिए खाली कंस्ट्रक्टर कैसे बनाएं


195

मेरे पास डेटा क्लास में 10+ पैरामीटर है, मैं डेटा क्लास को एक खाली कंस्ट्रक्टर के साथ आरंभीकृत करना चाहता हूं और केवल सेटर का उपयोग करके कुछ मापदंडों के लिए मान सेट करता हूं और सर्वर पर ऑब्जेक्ट पास करता हूं।

data class Activity(
        var updated_on: String,
        var tags: List<String>,
        var description: String,
        var user_id: List<Int>,
        var status_id: Int,
        var title: String,
        var created_at: String,
        var data: HashMap<*, *>,
        var id: Int,
        var counts: LinkedTreeMap<*, *>,
)

उपयोग:

ऐसा कुछ आसान होगा

                val activity =  Activity();
                activity.title = "New Computer"
                sendToServer(activity)

लेकिन निर्माणकर्ता के निर्माण के दौरान इसे पारित करने के लिए सभी तर्कों की आवश्यकता होती है। मैं ऊपर की तरह कैसे सरल कर सकता हूं?

                val activity =  Activity(null,null,null,null,null,"New Computer",null,null,null,null);
                sendToServer(activity)

जवाबों:


243

आपके पास यहां 2 विकल्प हैं:

  1. प्रत्येक प्राथमिक निर्माता पैरामीटर के लिए एक डिफ़ॉल्ट मान असाइन करें :

    data class Activity(
        var updated_on: String = "",
        var tags: List<String> = emptyList(),
        var description: String = "",
        var user_id: List<Int> = emptyList(),
        var status_id: Int = -1,
        var title: String = "",
        var created_at: String = "",
        var data: HashMap<*, *> = hashMapOf<Any, Any>(),
        var id: Int = -1,
        var counts: LinkedTreeMap<*, *> = LinkedTreeMap<Any, Any>()
    ) 
    
  2. एक ऐसे माध्यमिक निर्माता की घोषणा करें जिसके कोई पैरामीटर नहीं हैं:

    data class Activity(
        var updated_on: String,
        var tags: List<String>,
        var description: String,
        var user_id: List<Int>,
        var status_id: Int,
        var title: String,
        var created_at: String,
        var data: HashMap<*, *>,
        var id: Int,
        var counts: LinkedTreeMap<*, *>
    ) {
        constructor() : this("", emptyList(), 
                             "", emptyList(), -1, 
                             "", "", hashMapOf<Any, Any>(), 
                             -1, LinkedTreeMap<Any, Any>()
                             )
    }
    

आप पर भरोसा नहीं करते हैं copyया equalsके Activityवर्ग या ऑटोजनरेटेड का उपयोग नहीं करते data classसब पर तरीकों तुम इतनी तरह नियमित रूप से वर्ग इस्तेमाल कर सकते हैं:

class ActivityDto {
    var updated_on: String = "",
    var tags: List<String> = emptyList(),
    var description: String = "",
    var user_id: List<Int> = emptyList(),
    var status_id: Int = -1,
    var title: String = "",
    var created_at: String = "",
    var data: HashMap<*, *> = hashMapOf<Any, Any>(),
    var id: Int = -1,
    var counts: LinkedTreeMap<*, *> = LinkedTreeMap<Any, Any>()
}

प्रत्येक डीटीओ को data classइसके विपरीत होने की आवश्यकता नहीं है । वास्तव में मेरे अनुभव में मुझे उन क्षेत्रों में विशेष रूप से उपयोगी होने के लिए डेटा कक्षाएं मिलती हैं जिनमें कुछ जटिल व्यावसायिक तर्क शामिल हैं।


1
धन्यवाद @miensol, क्या कोई ऐसा तरीका है जो कॉपी फ़न का उपयोग करके किया जा सकता है। जैसे। kotlinlang.org/docs/reference/data-classes.html#copying
साई

@SaiKiran का उपयोग करने के लिए copyआपको डेटा वर्ग की आवश्यकता है। इसे बनाने के लिए आपको एक निर्माता को आमंत्रित करने की आवश्यकता है - और यहां मुद्दा था।
miensol

मैं एंड्रॉइड स्टूडियो 2.3 के लिए कोटलिन 1.1.2 का उपयोग कर रहा हूं और रिक्त स्थान उपलब्ध नहीं है: /
गोंजालो

कोई बात नहीं। मैंने अपनी build.gradle config फाइल में kotlin नहीं जोड़ा।
गोंजालो

3
@ मुहम्मचोटा emptyListबार-बार मेमोरी आवंटित नहीं करेंगे। यह एक सिंगलटन लौटाता है
miensol

69

यदि आप सभी क्षेत्रों के लिए डिफ़ॉल्ट मान देते हैं - खाली निर्माण कोटलीन द्वारा स्वचालित रूप से उत्पन्न होता है।

data class User(var id: Long = -1,
                var uniqueIdentifier: String? = null)

और आप बस कॉल कर सकते हैं:

val user = User()

अगर id ऑटो-जनरेट है तो कैसे उपयोग करें?
सिद्धपुरा अमित

मेरे लिए काम किया। फायरबेस चैट संदेश के लिए:class FeelComChatMessage (messageText: String = "", messageUser: String = "")
जितेंद्र सुर्वे

13

@Miensol उत्तर के साथ, मुझे कुछ विवरण जोड़ने दें:

यदि आप डेटा कक्षाओं का उपयोग करते हुए एक जावा-दृश्य खाली कंस्ट्रक्टर चाहते हैं, तो आपको इसे स्पष्ट रूप से परिभाषित करने की आवश्यकता है।

डिफ़ॉल्ट मानों का उपयोग करना + कंस्ट्रक्टर निर्दिष्ट करना काफी आसान है:

data class Activity(
    var updated_on: String = "",
    var tags: List<String> = emptyList(),
    var description: String = "",
    var user_id: List<Int> = emptyList(),
    var status_id: Int = -1,
    var title: String = "",
    var created_at: String = "",
    var data: HashMap<*, *> = hashMapOf<Any, Any>(),
    var id: Int = -1,
    var counts: LinkedTreeMap<*, *> = LinkedTreeMap<Any, Any>()
) {
    constructor() : this(title = "") // this constructor is an explicit
                                     // "empty" constructor, as seen by Java.
}

इसका मतलब है कि इस ट्रिक के साथ अब आप इस ऑब्जेक्ट को मानक जावा सीरीकेयर्स (जैक्सन, गेसन आदि) के साथ अनुक्रमित / डिस्क्राइब कर सकते हैं।


आखिरी तारीफ गलत है। कम से कम ग्सन धारावाहिक के लिए, वास्तव में, गॉसन वस्तुओं को बनाने के लिए असुरक्षित तंत्र का उपयोग करता है और यह आपके निर्माता को नहीं बुलाएगा। मैंने अभी एक संबंधित प्रश्न का जवाब दिया है stackoverflow.com/questions/59390294/…
Võ Quang H'a

6

यदि आप प्रत्येक प्राथमिक निर्माता पैरामीटर के लिए एक डिफ़ॉल्ट मान देते हैं:

data class Item(var id: String = "",
            var title: String = "",
            var condition: String = "",
            var price: String = "",
            var categoryId: String = "",
            var make: String = "",
            var model: String = "",
            var year: String = "",
            var bodyStyle: String = "",
            var detail: String = "",
            var latitude: Double = 0.0,
            var longitude: Double = 0.0,
            var listImages: List<String> = emptyList(),
            var idSeller: String = "")

और उस वर्ग से जहां आप इसे बिना तर्क के या उस क्षण के तर्क के साथ कह सकते हैं

var newItem = Item()

var newItem2 = Item(title = "exampleTitle",
            condition = "exampleCondition",
            price = "examplePrice",
            categoryId = "exampleCategoryId")

3

मैं प्राथमिक निर्माता को संशोधित करने और प्रत्येक पैरामीटर में एक डिफ़ॉल्ट मान जोड़ने का सुझाव दूंगा:

data class Activity(
    var updated_on: String = "",
    var tags: List<String> = emptyList(),
    var description: String = "",
    var user_id: List<Int> = emptyList(),
    var status_id: Int = -1,
    var title: String = "",
    var created_at: String = "",
    var data: HashMap<*, *> = hashMapOf<Any, Any>(),
    var id: Int = -1,
    var counts: LinkedTreeMap<*, *> = LinkedTreeMap<Any, Any>()
)

आप मानों को जोड़कर अशक्त बना सकते हैं ?और फिर आप आश्वासन दे सकते हैं null:

data class Activity(
    var updated_on: String? = null,
    var tags: List<String>? = null,
    var description: String? = null,
    var user_id: List<Int>? = null,
    var status_id: Int? = null,
    var title: String? = null,
    var created_at: String? = null,
    var data: HashMap<*, *>? = null,
    var id: Int? = null,
    var counts: LinkedTreeMap<*, *>? = null
)

सामान्य तौर पर, यह अशक्त वस्तुओं से बचने के लिए एक अच्छा अभ्यास है - कोड को इस तरह से लिखें कि हमें उनका उपयोग करने की आवश्यकता न हो। जावा की तुलना में गैर-अशक्त वस्तुएं कोटलिन के फायदों में से एक हैं। इसलिए, ऊपर पहला विकल्प बेहतर है

दोनों विकल्प आपको वांछित परिणाम देंगे:

val activity = Activity()
activity.title = "New Computer"
sendToServer(activity)

2

कोटलिन में डेटा वर्ग के लिए गैर-खाली माध्यमिक निर्माता:

data class ChemicalElement(var name: String,
                           var symbol: String,
                           var atomicNumber: Int,
                           var atomicWeight: Double,
                           var nobleMetal: Boolean?) {

    constructor(): this("Silver",
                        "Ag", 
                        47,
                        107.8682,
                        true)
}

fun main() {
    var chemicalElement = ChemicalElement()
    println("RESULT: ${chemicalElement.symbol} means ${chemicalElement.name}")
    println(chemicalElement)
}

// RESULT: Ag means Silver
// ChemicalElement(name=Silver, symbol=Ag, atomicNumber=47, atomicWeight=107.8682, nobleMetal=true)

कोटलिन में डेटा क्लास के लिए खाली माध्यमिक कंस्ट्रक्टर:

data class ChemicalElement(var name: String,
                           var symbol: String,
                           var atomicNumber: Int,
                           var atomicWeight: Double,
                           var nobleMetal: Boolean?) {

    constructor(): this("",
                        "", 
                        -1,
                        0.0,
                        null)
}

fun main() {
    var chemicalElement = ChemicalElement()
    println(chemicalElement)
}

// ChemicalElement(name=, symbol=, atomicNumber=-1, atomicWeight=0.0, nobleMetal=null)

2

से प्रलेखन

नोट: JVM पर, यदि प्राथमिक निर्माता के सभी मापदंडों में डिफ़ॉल्ट मान हैं, तो संकलक एक अतिरिक्त पैरामीटर रहित निर्माता उत्पन्न करेगा जो डिफ़ॉल्ट मानों का उपयोग करेगा। इससे जैकलिन या जेपीए जैसे पुस्तकालयों के साथ कोटलिन का उपयोग करना आसान हो जाता है जो पैरामीटर रहित निर्माणकर्ताओं के माध्यम से वर्ग उदाहरण बनाते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.