4

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

我能想出的方法:

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

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

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

我想为我的实体使用数据类的原因是因为这些实现equals并且hashcode默认情况下。为此,我们一直在 java 中使用 lombok,现在说服团队创建这些方法很困难。即使生成是由 IDE 进行的,它仍然会被检查到源代码控制中。

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

编辑:在评论中指出使用java.time.Instant哪个是不可变的。我面临的问题是这是一个Hibernate Entity Class,我们使用的是hibernate 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
    }
}
4

2 回答 2

0

尝试改用 java.sql.Date

于 2019-08-01T16:04:32.590 回答
0

你可以用一些技巧来做到这一点:

@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
}
于 2018-06-28T08:12:39.843 回答