Kotlin中扩展对象的新实例

时间:2017-05-29 14:43:04

标签: spring-data 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。 &#34;问题&#34;我有一个电子邮件总是必须有一个人。但是电子邮件从BaseContact获得了这个属性,所以我不能做类似下面的事情,因为&#34; person&#34;不是构造函数的一部分。

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

这会有效:

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

因为在电子邮件实例化之后,我现在可以访问&#34; person&#34;属性。

Kotlin有什么方法可以让我获得更多&#34; Groovy-like&#34;实例化新对象的方法,而不必为它的构造函数创建许多覆盖?我对扩展课程的情况特别感兴趣。

1 个答案:

答案 0 :(得分:1)

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

val john = Person(name = "John")

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