2016-06-17 27 views
45

我在数据类中有10多个参数,我想用一个空的构造函数初始化数据类,并使用setter将参数设置为少数,并将对象传递给服务器。如何在Kotlin中创建数据类的空构造函数Android

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) 

回答

71

你有2个选择这里:

  1. 指定一个默认值给每个primary constructor参数:

    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. 声明a secondary constructor没有参数:

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

如果不依靠copyActivity类的equals或不使用在所有自动生成的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>() 
} 

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

+1

感谢@miensol,有什么办法这可以使用复制的乐趣来完成。例如。 https://kotlinlang.org/docs/reference/data-classes.html#copying –

+0

@SaiKiran使用'copy'你需要一个数据类实例。要创建它,你需要调用一个构造函数 - 这是问题所在。 – miensol

+0

我使用Android Studio 2.3的Kotlin 1.1.2,并且emptyList不可用:/ – Gonzalo

3

随着@miensol答案,让我补充了一些细节:

如果您在使用数据类需要一个Java可见空的构造函数,你需要明确地定义它。

使用默认值+构造符是很容易的:

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. 
} 

这意味着,这一招你现在可以序列化/反序列化与标准的Java序列化(杰克逊,GSON等)此对象。

4

如果您将默认值分配给所有字段 - 由Kotlin自动生成空构造函数。

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

,你可以简单地调用:

val user = User() 
相关问题