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

新手上路,请多包涵

我在 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)

原文由 Sai 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

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

  1. 声明 一个没有参数的辅助构造 函数:
    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>()
                            )
   }

If you don’t rely on copy or equals of the Activity class or don’t use the data class methods at all you可以像这样使用常规类:

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

原文由 miensol 发布,翻译遵循 CC BY-SA 3.0 许可协议

对此的现代答案应该是使用 Kotlin 的 no-arg compiler plugin 它为经典 apies 创建了一个非参数构造代码, 更多关于这里

只需在 build.gradle 项目级别添加插件类路径

    dependencies {
    ....

    classpath "org.jetbrains.kotlin:kotlin-noarg:1.4.10"

    ....
    }

然后配置您的注释以生成 no-arg 构造函数

apply plugin: "kotlin-noarg"

noArg {
      annotation("your.path.to.annotaion.NoArg")
      invokeInitializers = true
}

然后定义你的注释文件 NoArg.kt

  @Target(AnnotationTarget.CLASS)
 @Retention(AnnotationRetention.SOURCE)
 annotation class NoArg

最后,在任何数据类中,您都可以简单地使用自己的注释

@NoArg
data class SomeClass( val datafield:Type , ...   )

我曾经创建自己的 no-arg 构造函数作为接受的答案,我通过搜索得到了这个答案,但后来这个插件发布了,我发现它更干净了。

原文由 mxml 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题