Kotlin 长主构造函数和继承



这个问题可以概括,但是在Spring Data框架中创建Kotlin@Entity类时,这个问题悄悄地出现了。每个实体都应该扩展AbstractPersistable,它通常有相当多的字段:

@Entity
class Book(
var author: String? = null,
var title: String? = null
): AbstractPersistable<Int>()

现在,此代码段显示了一个小表。您可以轻松想象更多的字段(列(,通常每个字段都有一个注释、一个@Column@OneToMany注释,然后在它们之间有空行。它很快就会填满一页。这不是坏事(在我看来(。

让我对这段代码感到困扰的是,超类(或任何实现的接口(与class Book行分离得如此之多——它变得隐藏起来。每当使用 Kotlin 的主要构造函数功能时,都会发生这种情况。总的来说,它很棒,但将类定义的重点从继承转移到了数据。

有哪些风格选择?

  1. 习惯了。新语言,新模式。
  2. 不要使用此语法。请改用constructor关键字。镜像 Java 的样子。但是,要像以前一样使用该类,您必须吞下一颗苦药:手动创建构造函数,不仅包括所有构造,而且理想情况下还包括所有字段的所有默认值,基本上复制代码。
  3. 我现在想不出的第三种完美方式。

据我了解,您最接近所需内容的是:

class Book private constructor(): AbstractPersistable<Int>() {
constructor(
author: String? = null,
title: String? = null
) : this()
}

基本上使主构造函数私有,并强制使用辅助构造函数。

我想指出这一部分:

"这将类定义的焦点从继承转移到数据">

这实际上是 Kotlin 的意图之一,比继承有更多的组合。他们如何将by构建到语言中也是如此。

最新更新