কোটলিন অ্যান্ড্রয়েডে ডেটা ক্লাসের জন্য কীভাবে খালি কনস্ট্রাক্টর তৈরি করবেন


194

আমার একটি ডেটা ক্লাসে 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)

উত্তর:


242

আপনার কাছে এখানে 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
ধন্যবাদ @ মিয়েনসোল, কপির মজা ব্যবহার করে এটি করার কোনও উপায় আছে কি? যেমন। কোটলিংলং.আর্গ
সায়

@ সাইকিরান আপনার ব্যবহারের জন্য copyডেটা ক্লাসের উদাহরণ প্রয়োজন। এটি তৈরি করার জন্য আপনাকে একজন কনস্ট্রাক্টরকে আবেদন করতে হবে - এবং এখানে সমস্যাটি ছিল।
মিনসোল

আমি অ্যান্ড্রয়েড স্টুডিও ২.৩ এর জন্য কোটলিন ১.১.২ ব্যবহার করছি এবং খালি তালিকা পাওয়া যায় না: /
গঞ্জালো

কিছু মনে করো না. আমি আমার বিল্ডড্র্যাডল কনফিগারেশন ফাইলে কোটলিন যুক্ত করিনি।
গঞ্জালো

3
@ মুহাম্মাদছোটা emptyListবারবার মেমরি বরাদ্দ দেবে না। এটি একটি সিঙ্গলটন ফেরত দেয়
মিনসোল

69

আপনি যদি সমস্ত ক্ষেত্রকে ডিফল্ট মান দেন - খালি কনস্ট্রাক্টর স্বয়ংক্রিয়ভাবে কোটলিন দ্বারা উত্পন্ন হয়।

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

এবং আপনি কেবল কল করতে পারেন:

val user = User()

আইডি যদি স্বয়ংক্রিয়ভাবে উত্পন্ন হয় তবে কীভাবে ব্যবহার করবেন?
সিদ্ধপুরা অমিত

আমার জন্য কাজ করেছেন। ফায়ারবেস চ্যাট বার্তার জন্য:class FeelComChatMessage (messageText: String = "", messageUser: String = "")
জিতেন্দ্র

13

@ মিয়েনসোল উত্তরের পাশাপাশি আমাকে কিছু বিবরণ যোগ করতে দাও:

আপনি যদি ডেটা ক্লাস ব্যবহার করে কোনও জাভা-দৃশ্যমান খালি কনস্ট্রাক্টর চান তবে আপনার এটি স্পষ্টভাবে সংজ্ঞায়িত করতে হবে।

ডিফল্ট মান + কনস্ট্রাক্টর স্পেসিফায়ার ব্যবহার করা বেশ সহজ:

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
)

সাধারণভাবে, অযোগ্য বস্তুগুলি এড়ানোর জন্য এটি একটি ভাল অনুশীলন - কোডটি এমনভাবে লিখুন যাতে সেগুলি ব্যবহার করার দরকার নেই। জাভা-র তুলনায় কোটলিনের অপরিহার্য এক জিনিস objects অতএব, উপরের প্রথম বিকল্পটি পছন্দসই

উভয় বিকল্প আপনাকে পছন্দসই ফলাফল দেবে:

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

ডকুমেন্টেশন থেকে

দ্রষ্টব্য: জেভিএম-তে, যদি প্রাথমিক কন্সট্রাক্টরের সমস্ত পরামিতিগুলির ডিফল্ট মান থাকে তবে সংকলকটি অতিরিক্ত পরামিতি নির্মানকারী তৈরি করবে যা ডিফল্ট মানগুলি ব্যবহার করবে। এটি জ্যাকসন বা জেপিএর মতো লাইব্রেরিগুলির সাথে কোটলিন ব্যবহার করা আরও সহজ করে যা প্যারামিটারলেস কনস্ট্রাক্টরের মাধ্যমে শ্রেণীর উদাহরণ তৈরি করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.