如何在 Kotlin Android 中为数据类创建空构造函数 [英] How to create empty constructor for data class in Kotlin Android

查看:64
本文介绍了如何在 Kotlin Android 中为数据类创建空构造函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 Kotlin 数据类中声明了 10 多个变量,我想为它创建一个空的构造函数,就像我们通常在 Java 中所做的那样.

I have 10+ variables declared in Kotlin data class, and I would like to create an empty constructor for it like how we typically do in Java.

数据类:

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)

但是数据类要求在创建构造函数时传递所有参数.我们如何像 Java POJO 类构造函数一样简化它?

But the data class requires all arguments to be passed while creating a constructor. How can we simplify this like the Java POJO class constructor?

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

推荐答案

这里有 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>()
) 

  • 声明没有参数的二级构造函数:

    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>()
                             )
    }
    

  • 如果您不依赖 Activity 类的 copyequals 或不使用自动生成的 data 类 方法,您可以像这样使用常规类:

    If you don't rely on copy or equals of the Activity class or don't use the autogenerated data class methods at all you could use regular class like so:

    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>()
    }
    

    并非每个DTO都需要是数据类,反之亦然反之.事实上,根据我的经验,我发现数据类在涉及一些复杂业务逻辑的领域特别有用.

    Not every DTO needs to be a data class and vice versa. In fact in my experience I find data classes to be particularly useful in areas that involve some complex business logic.

    这篇关于如何在 Kotlin Android 中为数据类创建空构造函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆