首页 > 解决方案 > 类头中的属性与类主体中的属性

问题描述

我有一个abstract class实体。

abstract class AbstractEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id")
    @SequenceGenerator(name = "id", sequenceName = "id_sequence", allocationSize = 1000)
    var id: Long? = null

    @Version
    private var version: Int = 0


    @NotNull
    var createdDate = ZonedDateTime.now()!!
}

我有一个继承自的类(javax.persistence Entity)AbstarctEntiy

@Entity
@Table(schema = "query")
data class Query(
    var name: String?,
) : AbstractEntity()

users在以下两个代码中使用类头和类主体之间有什么区别吗?

1

@Entity
@Table(schema = "query")
data class Query(
    var name: String?,
    @OneToMany(mappedBy = "id", fetch = FetchType.EAGER)
    var users : List<Username> = mutableListOf()
) : AbstractEntity()

2

@Entity
@Table(schema = "query")
data class Query(
    var name: String?,
) : AbstractEntity() {
    @OneToMany(mappedBy = "id", fetch = FetchType.EAGER)
    var users : List<Username> = mutableListOf()
}

标签: kotlin

解决方案


通过构造函数传递项目和将其设置为属性之间存在区别,因为您使用data类来保存它们。

虽然在示例 1 和 2 中,Kotlin 为username字段生成了一个 getter 和一个 setter,但使用数据类的主要好处仅适用于通过构造函数传递的项目。

在示例 1 中,因为它是一个数据类,所以 Kotlin 覆盖了您传递给构造函数的属性的 'copy'、'toString'、'hashCode' 和 'equals' 类。举个例子,'toString' 函数在反编译的 java 代码中看起来像这样

   @NotNull
   public String toString() {
      return "Query(name=" + this.name + ", users=" + this.users + ")";
   }

name在示例 2 中,您只能从传递给构造函数的属性中获得此好处,而不是user列表。在这种情况下,toString()我提到的和所有其他功能只会考虑name

   public String toString() {
      return "Query1(name=" + this.name + ")";
   }

这对所有其余部分都是正确的copy() hashCode(),并且equals()

如果您关心 Kotlin 为两者处理这些username然后在构造函数中传递它们。否则,没关系。


推荐阅读