Как создать пустой конструктор для класса данных в Kotlin Android

У меня есть параметр 10+ в классе данных, я хочу инициализировать класс данных с помощью пустого конструктора и установить значения только для нескольких параметров с помощью setter и передать объект на сервер.

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) 

У вас есть 2 варианта:

  1. Назначьте значение по умолчанию для каждого параметра первичного конструктора :

     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. Объявить вторичный конструктор, который не имеет параметров:

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

Если вы не полагаетесь на copy или equals классу Activity или не используете методы data class автоматически генерируемых 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 и наоборот. Фактически, по моему опыту, я считаю, что классы данных особенно полезны в областях, которые связаны с некоторой сложной бизнес-логикой.

Наряду с ответом @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 (Jackson, Gson и т. Д.).

Если вы укажете значения по умолчанию для всех полей – пустой конструктор автоматически создается Kotlin.

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

и вы можете просто позвонить:

 val user = User()