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

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

问题描述

我在一个数据类中有10个以上的参数,我想用一个空的构造函数初始化该数据类,并使用setter仅设置几个参数的值,然后将该对象传递给服务器.

I have 10+ parameter in a data class, I want to initialize the data class with an empty constructor and set the values only for few parameters using setter and pass the object to the server.

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)

但是它要求在创建构造函数时传递所有参数.我如何像上面那样简化?

But it requires all arguments to be passed while the creating constructor. How can I simplify like above?

                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 class方法,则可以使用常规类,如下所示:

    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 都必须是data class,反之亦然.实际上,根据我的经验,我发现数据类在涉及一些复杂业务逻辑的领域中特别有用.

    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天全站免登陆