How to create empty constructor for data class in Kotlin Android How to create empty constructor for data class in Kotlin Android android android

How to create empty constructor for data class in Kotlin Android


You have 2 options here:

  1. Assign a default value to each primary constructor parameter:

    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. Declare a secondary constructor that has no parameters:

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

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

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.


If you give default values to all the fields - empty constructor is generated automatically by Kotlin.

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

and you can simply call:

val user = User()


Along with @miensol answer, let me add some details:

If you want a Java-visible empty constructor using data classes, you need to define it explicitely.

Using default values + constructor specifier is quite easy:

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

This means that with this trick you can now serialize/deserialize this object with the standard Java serializers (Jackson, Gson etc).