kotlin - 类头中的属性与类主体中的属性
问题描述
我有一个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()
}
解决方案
通过构造函数传递项目和将其设置为属性之间存在区别,因为您使用data
类来保存它们。
虽然在示例 1 和 2 中,Kotlin 为user
和name
字段生成了一个 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 为两者处理这些user
,name
然后在构造函数中传递它们。否则,没关系。
推荐阅读
- frama-c - 在 FRAMA-C 中验证矩阵转置函数
- excel - Excel:获取前 3 个值和名称
- algorithm - 如何在 |V| 中找到图的 MST 给定生成树加上另一条边的时间
- c# - 如何下载电子邮件附件 asp.net 网络表单?
- php - Laravel 模型创建覆盖
- java - 是什么影响了 JVM 内存分配超出 -Xmx?
- python - 如何改进 textacy.extract.semistructured_statements() 结果
- multithreading - 如何在 Rust 结构中创建线程局部变量?
- r - 如果另一列包含值,则过滤列值
- c++ - 当最小分配对齐为 16 字节时,如何进行 24 字节大小的分配?