java - 来自 Java 超类构造函数访问的 Kotlin 构造函数
问题描述
我不认为我的标题会更令人困惑。我正在将 Kotlin 集成到现有的 Java 项目中。我有一个基本上像这样定义的Java类:
class EntityBase {
private Long id;
public EntityBase() { }
public EntityBase(Long id) { this.id = id; }
}
然后,我已经像这样定义了一个 Kotlin 数据类,并且我试图使用伴随方法从 DTO 中水合这个对象,但是我无法EntityBase.id
通过对象创建从这个方法访问:
data class Thing(
val name: String,
val desc: String
) : EntityBase() {
companion object {
fun fromDto(dto: ThingDto) = Thing(
name = dto.name,
desc = dto.desc
id = dto.id // this doesn't work because id isn't part of Thing's constructor
)
}
我可以通过使用构造函数而不是伴随对象来解决这个问题,但我很好奇是否有一种我不知道的方法来做到这一点。对 Kotlin 来说还是很新的。
解决方案
您需要添加id
到您的构造函数并在扩展时将其传递给基类构造函数。
private data class Thing(
val name: String,
val desc: String,
val id: Long
) : EntityBase(id) {
companion object {
fun fromDto(dto: ThingDto) = Thing(
name = dto.name,
desc = dto.desc,
id = dto.id
)
}
}
这就是“使用构造函数”的意思吗?如果你不想有构造函数,你必须在你的基类中使用getter/setter(注意我不推荐以下,为了说明而显示)——
class EntityBase {
private Long id;
public EntityBase() { }
public EntityBase(Long id) { this.id = id; }
public void setId(Long id) { this.id = id; }
public Long getId() { return id; }
}
然后你可以做——
private data class Thing(
val name: String,
val desc: String
) : EntityBase() {
companion object {
fun fromDto(dto: ThingDto) : Thing {
val thing = Thing(
name = dto.name,
desc = dto.desc)
thing.id = dto.id;
return thing;
}
}
}
然后,您没有链接构造函数,但这有一个很大的缺点 -id
不是数据类的一部分,toString
, copy
,equals
等只会使用data
类的构造函数中的值生成。如果你toString
使用上面的方法调用一个对象,你会看到它只使用name
and desc
。
推荐阅读
- java - Gradle - dependencies with because statement
- selenium - SpreadJS 硒自动化问题
- python-3.x - 从脚本在 XFCE 中打开终端并激活 python virtualenv
- c# - Implementing open close principle when interfaces are different
- javascript - React Hooks : UseRef not recognizing Event from Material UI Select
- html - How to make a border around clip path shape?
- opencv - 图像配准和焦点堆叠
- angular - ngoninit 不适用于动态组件
- python - Assign a value to a button in tkinter
- c# - 在 VS 2019 中使用 Span 会产生异常