首页 文章

如何在Kotlin Android中为数据类创建空构造函数

提问于
浏览
104

我在数据类中有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)

5 回答

  • 145

    这里有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>()
                             )
    }
    

    如果您不依赖 Activity 类的 copyequals 或者根本不使用自动生成的 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 ,反之亦然 . 事实上,根据我的经验,我发现数据类在涉及一些复杂业务逻辑的领域特别有用 .

  • 2

    如果你给 default values to all the fields - 空构造函数是由Kotlin自动生成的 .

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

    你可以简单地打电话:

    val user = User()
    
  • 10

    与@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等)序列化/反序列化此对象 .

  • 2

    如果为每个主构造函数参数提供默认值:

    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")
    
  • 34

    Kotlin中数据类的非空辅助构造函数:

    data class ChemicalElement(var name: String,
                               var symbol: String,
                               var atomicNumber: Int,
                               var atomicWeight: Double,
                               var nobleMetal: Boolean?) {
    
        constructor(): this("Silver",
                            "Ag", 
                            47,
                            107.8682,
                            true)
    }
    
    fun main() {
        var chemicalElement = ChemicalElement()
        println("RESULT: ${chemicalElement.symbol} means ${chemicalElement.name}")
        println(chemicalElement)
    }
    
    // RESULT: Ag means Silver
    // ChemicalElement(name=Silver, symbol=Ag, atomicNumber=47, atomicWeight=107.8682, nobleMetal=true)
    

    Kotlin中数据类的空辅助构造函数:

    data class ChemicalElement(var name: String,
                               var symbol: String,
                               var atomicNumber: Int,
                               var atomicWeight: Double,
                               var nobleMetal: Boolean?) {
    
        constructor(): this("",
                            "", 
                            -1,
                            0.0,
                            null)
    }
    
    fun main() {
        var chemicalElement = ChemicalElement()
        println(chemicalElement)
    }
    
    // ChemicalElement(name=, symbol=, atomicNumber=-1, atomicWeight=0.0, nobleMetal=null)
    

相关问题