gpt4 book ai didi

date - 如何使用 Java Date 对象使 Kotlin 中的数据类不可变?

转载 作者:行者123 更新时间:2023-12-01 05:59:54 26 4
gpt4 key购买 nike

java.util.Date本身是一个可变对象。因此,即使 Kotlin 数据类(日期字段声明为 val)阻止我更改引用,我也可以修改日期对象本身以更改其值。

我能想到的方法:

使用普通类,覆盖 getter 和 setter。在每个使用克隆方法制作给定日期的副本。

    @Column(name = "db_date")
private var dbDate: Date? = null
get() = dbDate?.clone() as Date
set(date) {
field = date?.clone() as Date
}

我也不能使用 copy数据类的方法,因为这些类是休眠实体。所以我需要通过setter来修改它们。

我想为我的实体使用数据类的原因是因为这些实现了 equalshashcode默认情况下。为此,我们一直在 Java 中使用 lombok,现在很难说服团队创建这些方法。即使生成是由 IDE 进行的,它仍然会被检入源代码管理。

那么有什么方法可以对数据类逻辑进行自定义 setter 。或者我可以为普通类生成equals和hashcode而无需在源代码管理中检查它们的任何方式?

编辑:在评论中指出使用 java.time.Instant这是不可变的。我面临的问题是这是一个 休眠实体类 我们正在使用 休眠 3.6 .即时支持在 hibernate 5.2 中出现,所以我们远远落后,hibernate 的迁移将是一项繁重的任务。我注意到的是 kotlin 数据类确实以不同的方式允许 setter 和 getter。代码如下:
@Entity
@Table(name = "my_table")
data class MyTable(
@Id
@Column(name = "id")
var id: Long? = null,


@Column(name = "my_date")
private var date: Date? = null,


) {
fun getDate():Date = gradedDate?.clone() as Date
fun setDate(date: Date?) {
this.date = date?.clone() as Date
}
}

最佳答案

你可以通过一些黑客来做到这一点:

@Entity
@Table(name = "my_table")
data class DateWrapper(

@Id
@Column(name = "id")
val id: Long?,

@Column(name = "my_date")
private var _date: Date?
) {

init {
_date = _date?.clone() as Date
}

val date = _date
}

关于date - 如何使用 Java Date 对象使 Kotlin 中的数据类不可变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46743362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com