Как создать пустой конструктор для класса данных в 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)
4 ответов:
у вас есть 2 варианта:
присвоить значение по умолчанию для каждого главный конструктор:
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>() )объявить вторичный конструктор это не имеет параметров:
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методы можно использовать обычный класс, как Итак: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и наоборот. На самом деле, по моему опыту, я считаю, что классы данных особенно полезны в областях, которые связаны с некоторой сложной бизнес-логикой.
Если вы даете значения по умолчанию для всех полей - пустой конструктор генерируется автоматически 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<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 и т. д.).
Если вы зададите значение по умолчанию для каждого параметра основного конструктора:
data class Item(var id: String = "", var title: String = "", var condition: String = "", var price: String = "", var categoryId: String = "", var make: String = "", var model: String = "", var year: String = "", var bodyStyle: String = "", var detail: String = "", var latitude: Double = 0.0, var longitude: Double = 0.0, var listImages: List<String> = emptyList(), var idSeller: String = "")и из класса, где экземпляры вы можете вызвать его без аргументов или с аргументами, которые у вас есть в этот момент
var newItem = Item() var newItem2 = Item(title = "exampleTitle", condition = "exampleCondition", price = "examplePrice", categoryId = "exampleCategoryId")
Comments