我认为我的标题可能更令人困惑。我将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来说还是一个新手。
答案 0 :(得分:1)
您需要将tdiff = current_time - date_parsed.replace(year=current_time.year)
if tdiff.days < 0:
tdiff = current_time - date_parsed.replace(year=current_time.year-1)
添加到构造函数中,并在扩展时将其传递给基类构造函数。
id
这就是“使用构造函数”的意思吗?如果你不想拥有构造函数,你必须在你的基类中使用getter / setter(注意我不建议使用以下内容,以示插图) -
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
)
}
}
然后你可以做 -
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
,{{1}只会使用copy
类的构造函数中的值生成等等。如果您使用上述内容对某个对象发送equals
,则会看到它仅使用data
和toString
。