Как создать пустой конструктор для класса данных в 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)
744   4  

4 ответов:

у вас есть 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 методы можно использовать обычный класс, как Итак:

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

    Ничего не найдено.