加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何在Kotlin中使用java Date对象使数据类不可变?

发布时间:2020-12-15 02:20:33 所属栏目:Java 来源:网络整理
导读:java.util.Date本身是一个可变对象.因此,即使Kotlin数据类(日期字段声明为val)阻止我更改引用,我也可以修改日期对象本身来更改其值. 我能想出的方法: 使用普通类,覆盖getter和setter.在每次使用克隆方法来制作给定日期的副本. @Column(name = "db_date") pr
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
    }

此外,我不能使用数据类的复制方法,因为这些类是休眠实体.所以我需要通过setter修改它们.

我想为我的实体使用数据类的原因是因为默认情况下这些实现equals和hashcode.我们一直在java中使用lombok,现在令人信服的团队创建这些方法很难.即使由IDE发生一代,它仍然会被检查到源代码控制中.

那么有什么办法可以在数据类逻辑上做自定义setter.或者我可以为普通类生成equals和hashcode,而无需在源代码管理中检查它们?

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

解决方法

你可以用一些黑客做到这一点:
????

@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
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读