Kotlin中扩展对象的新实例

我是来自Groovy的Kotlin新手。 作为学习语言的一种方式,我试图重现Kotlin上的一些小的Groovy例子。

考虑以下几点:

@Entity data class Person( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long = 0, var name: String = "", @OneToMany(mappedBy = "person") var contacts: MutableList<BaseContact>? = null ) : BaseEntity() @Entity @Inheritance open class BaseContact( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long = 0, @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "person_id", referencedColumnName = "id") var person: Person ) @Entity @DiscriminatorValue("email") data class Email( var address: String = "" ) : BaseContact() @Entity @DiscriminatorValue("phone") data class Phone( var number: String = "" ) : BaseContact() 

我有一些Spring数据应用程序,我试图在Kotlin重现,其中一些使用@Inheritance。 我遇到的“问题”是电子邮件总是有一个人。 但电子邮件从BaseContact获得该属性,所以我不能做像波纹管的东西,因为“人”不是构造函数的一部分。

 val john = Person(name = 'John') val email = Email(address = 'john@mail.com', person = john) 

这将工作,虽然:

 val email = Email(address = 'john@mail.com') email.person = john 

因为在实例化电子邮件后,我现在可以访问“人物”属性。

有没有什么办法可以让Kotlin实现更类似于Groovy的方式来实例化新对象,而无需为其构造函数创建多个覆盖? 我特别感兴趣的是扩展类的情况。

在实例化对象之后初始化属性的惯用方法是使用.apply { }扩展函数:

 val john = Person(name = "John") val email = Email(address = "john@mail.com").apply { person = john /* more initialization in scope of `email` */ }