我在Kotlin数据类中声明了10多个变量,我想为它创建一个空构造函数,就像我们在Java中通常做的那样.

数据类:

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)

但是数据类要求在创建构造函数时传递所有参数.我们如何像Java POJO类构造函数那样简化它?

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

推荐答案

这里有两个选项:

  1. for each primary constructor参数指定一个默认值:

    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. 声明没有参数的a secondary constructor:

    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个,反之亦然.事实上,根据我的经验,我发现数据类在涉及一些复杂业务逻辑的领域特别有用.

Android相关问答推荐

Android Jetpack编写如何在简单单击后显示工具提示

Android Studio:如何判断我使用的是哪种构建类型?

如果我将日期存储为字符串yyyy-mm--dd,如何通过对Room数据库中的日期字段进行比较来进行更复杂的查询?

以正确的方式从房间收集流量

合成 colored颜色 的GSON反序列化

Kotlin DSL:为什么我可以从Play Store获取发布版本的日志(log)?

在Jetpack Compose中,如何判断屏幕是否已重新组合?

Jetpack Compose主导航中的全屏图标列表

如何在Jetpack Compose android中使用导航

如何显示具体的商品数量?

当 EditText 用于在 android studio 中将字符串发送到 firebase 时,仅允许安全调用错误

如何在ExecutorService中设置progressBar的进度?不想使用 AsyncTask,因为它已被弃用

是否可以按照干净的体系 struct 将活动实例传递给视图模型

任务 ':app:kaptGenerateStubsDebugKotlin' 执行失败

在移动设备上看到时如何增加 PasswordField 文本?

Compose Accompaniist Pager 中的 TabRow/Tab 重组问题

如何在屏幕旋转或系统主题更改后将光标移动到 TextField 的末尾并保持键盘显示?

可组合的 fillMaxSize 和旋转不起作用

未解决的参考:getIntentSender / try 在 Jetpack Compose 中获取电话号码时

我的自定义视图没有显示我应该如何修复它?