如何在Kotlin Android中为数据类创建空构造函数

我有一个数据类10+参数,我想用一个空的构造函数初始化数据类,并使用setter只为少数参数设置值,并传递对象到服务器。

data class Activity( var updated_on: String, var tags: List, var description: String, var user_id: List, 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) 

你有两个选择:

  1. 为每个主构造函数参数分配一个默认值:

     data class Activity( var updated_on: String = "", var tags: List = emptyList(), var description: String = "", var user_id: List = emptyList(), var status_id: Int = -1, var title: String = "", var created_at: String = "", var data: HashMap<*, *> = hashMapOf(), var id: Int = -1, var counts: LinkedTreeMap<*, *> = LinkedTreeMap() ) 
  2. 声明一个没有参数的辅助构造函数:

     data class Activity( var updated_on: String, var tags: List, var description: String, var user_id: List, 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(), -1, LinkedTreeMap() ) } 

如果你不依赖于Activity类的copy或者equals ,或者根本不使用自动生成的data class方法,那么你可以使用常规的类:

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

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

如果你给所有的字段默认值 – 空的构造函数是由Kotlin自动生成的。

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

你可以简单地调用:

 val user = User() 

与@miensol答案一起,让我添加一些细节:

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

使用默认值+构造函数说明符是很容易的:

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

这意味着使用这个技巧,你现在可以用标准的Java序列化器(Jackson,Gson等)对这个对象进行序列化/反序列化。