如何在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) 

3 Solutions collect form web for “如何在Kotlin Android中为数据类创建空构造函数”

你有两个选择:

  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等)对这个对象进行序列化/反序列化。

  • 在Kotlin中,Jackson数据类的反序列化错误
  • 在构造函数中调用类的方法作为默认参数
  • 为什么Kotlin编译器需要var属性的显式初始化器?
  • 为什么我不能在typealias上使用@PublishedApi?
  • 为什么专家将MutableList更改为List?
  • 我可以为kotlin桌面应用程序使用@autowire(spring-context)吗?
  • 如何用Kotlin调用自定义对话框? 将java转换为kotlin后失败
  • IllegalArgumentException:savedInstanceState指定为非空为空
  • 如何输出/打印到TextView的值
  • 如何用一个复合types的数组来调用postgres函数
  • 格式在kotlin字符串模板
  • Kotlin language will be the best programming language for Android.