如何使Kotlin中的数据类不可变与日期对象的Java?

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的龙目岛这个,现在令人信服的团队创造这些方法是艰难的。 即使通过IDE发生,它仍然会被检查到源代码管理。

那么有什么办法可以做数据类逻辑的自定义设置器。 或者任何我可以生成等于和正常类的哈希码,而无需在源代码管理中检查它们?

编辑:在注释中指出使用java.time.Instant是不可变的。 我面临的问题是这是一个Hibernate实体类 ,我们正在使用休眠3.6 。 即时支持来到休眠5.2,所以我们是后面的方式,迁移休眠将是一个沉重的任务。 我注意到的是,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 } }