如何在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)
你有两个选择:
-
为每个主构造函数参数分配一个默认值:
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 () ) -
声明一个没有参数的辅助构造函数:
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等)对这个对象进行序列化/反序列化。
- 为什么我的应用程序只有在使用OpenFileInput / Ouput函数时将字符串直接赋值给代码时才起作用
- Kotlin库’rxkotlin-0.21.0.jar’具有不受支持的格式。 请更新库或插件
- 在Kotlin文件的主要方法中,android studio“error:can not find or load main class”
- 在kotlin中设置UserDefaultsKeys(swift)
- Java to Kotlin转换器和可空方法参数
- NullPointerException在Kotlin中
- Android Studio 3.0在重建之后重复压缩输入警告
- kotlin是function性的还是程序性的?
- 我怎样才能避免在Kotlin空属性