【问题标题】:kotlin default value in data class is aways zero [duplicate]数据类中的kotlin默认值始终为零[重复]
【发布时间】:2018-08-17 11:36:36
【问题描述】:

我有一个简单的用户数据类

data class User(@PrimaryKey(autoGenerate = true) val id: Long, val _id: String, val name: String, val about: String,
                    val phoneNumber: String, val token: String,
                    val lastLogin: String, val avatarUrl: String, @Embedded val location: Location,
                    val emailId: String, val gender: Boolean, val timestamp: Long = System.currentTimeMillis())

如你所见,最后一个参数是val timestamp: Long = System.currentTimeMillis()

响应来自使用改造的网络并使用GSON 解析

timestamp 没有出现在响应 json 中,它只是我需要做一些逻辑的额外字段。问题是值总是0。应该是当前时间戳

【问题讨论】:

  • 所以我需要使用另一个库来做一点改变。 gson 已经在应用程序的所有地方使用,并且为同一目的使用两个不同的库是没有意义的。
  • 也许一旦你意识到 GSON 调用 Unsafe.allocateObject() 来创建你的对象而不调用实际类要求的任何初始化代码,它就开始有意义了。你破解,你就输了。但是,您的出路可能是确保使用默认构造函数编译您的类。然后 GSON 将调用它而不是肮脏的 Unsafe hack。

标签: kotlin data-class


【解决方案1】:

这样就可以了,

data class User(@PrimaryKey(autoGenerate = true) val id: Long, val _id: String, val name: String, val about: String,
                val phoneNumber: String, val token: String,
                val lastLogin: String, val avatarUrl: String, @Embedded val location: Location,
                val emailId: String, val gender: Boolean) {
    var timestamp: Long = System.currentTimeMillis()
    get() = if(field > 0) field else {
        field = System.currentTimeMillis()
        field
    }
}

【讨论】:

  • 您好,抱歉,但它每次都会给我最新的时间戳。响应以时间戳保存在 db 中,当再次从 db 获取用户时,get 方法将覆盖并给出当前时间戳。
  • 我不能说这是最有效的方法,但我已经更新了我的答案来处理你的情况。如果有帮助,请接受答案。谢谢。
  • 只需将 val 更改为 var,我已经更新了答案。这将使警告消失。我希望这种方式能奏效。
猜你喜欢
  • 2020-10-06
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-22
相关资源
最近更新 更多