Cómo crear un constructor vacío para la class de datos en Kotlin Android

Tengo más de 10 parameters en una class de datos, quiero inicializar la class de datos con un constructor vacío y establecer los valores solo para algunos parameters usando setter y pasar el object al server.

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<*, *>, ) 

Uso:

Algo como esto será fácil

  val activity = Activity(); activity.title = "New Computer" sendToServer(activity) 

Pero requiere que se pasen todos los arguments mientras se crea el constructor. ¿Cómo puedo simplificar como arriba?

  val activity = Activity(null,null,null,null,null,"New Computer",null,null,null,null); sendToServer(activity) 

Tienes 2 opciones aquí:

  1. Asigne un valor pnetworkingeterminado a cada parámetro de constructor primario :

     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 un constructor secundario que no tiene 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>() ) } 

Si no confía en la copy o equals a la class Activity o no usa los methods de la data class autogenerados, podría usar la class regular de esta forma:

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

No todas las DTO deben ser una data class y viceversa. De hecho, en mi experiencia, encuentro que las classs de datos son particularmente útiles en áreas que involucran una lógica comercial compleja.

Junto con la respuesta @miensol, permítanme agregar algunos detalles:

Si desea un constructor vacío Java-visible que use classs de datos, necesita definirlo explícitamente.

Usar valores pnetworkingeterminados + especificador de constructor es bastante fácil:

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

Esto significa que con este truco ahora puede serializar / deserializar este object con los serializadores Java estándar (Jackson, Gson, etc.).

  • Single.zip completando antes de Success
  • Clase de datos kotlin + validation de frijol jsr 303
  • El selector común Kotlin anko no funciona como en los ejemplos proporcionados
  • Obteniendo datos de local y remoto simultáneamente usando RxJava
  • Kotlin encadena el performance de las funciones de colección
  • Kotlin accede a la class Java
  • Smart-cast y comparación dentro de Expression después de 'is' type-check
  • Glide no puede cargar la URL de la image del server
  • ¿Cómo declarar una class que contiene un campo de tipo genérico en Kotlin?
  • getFragmentManager () no funciona en Kotlin
  • Inicialización lenta del miembro anulable