Kotlin长主构造函数和继承
这个问题可以概括,但它是在Spring数据框架中创建KotlinKotlin长主构造函数和继承,kotlin,spring-data-jpa,Kotlin,Spring Data Jpa,这个问题可以概括,但它是在Spring数据框架中创建Kotlin@Entity类时出现的。每个实体都应该扩展AbstractPersistable,它通常有很多字段: @Entity class Book( var author: String? = null, var title: String? = null ): AbstractPersistable<Int>() @实体 课堂用书( 变量作者:字符串?=null, 变量标题:字符串?=nul
@Entity
类时出现的。每个实体都应该扩展AbstractPersistable
,它通常有很多字段:
@Entity
class Book(
var author: String? = null,
var title: String? = null
): AbstractPersistable<Int>()
@实体
课堂用书(
变量作者:字符串?=null,
变量标题:字符串?=null
):AbstractPersistable()
现在,这个片段显示了一个小表。您可以很容易地想象更多的字段(列),通常每个字段都有注释、一个@Column
或@OneToMany
注释,然后在它们之间有空行。它很快就会占满一页。(在我看来)这不是坏事
那些代码让我感到不舒服的是,超级类(或任何实现的接口)与类书
行分离得太多了,它变得隐藏起来了。只要使用Kotlin的主构造函数特性,就会发生这种情况。一般来说,这很好,但是将类定义的焦点从继承转移到了数据
风格选择是什么
构造函数
关键字。镜像Java的外观。然而,要像以前一样使用该类,您必须吞下一颗苦果:手动创建构造函数,不仅包括所有的赋值,理想情况下还包括所有字段的所有默认值,基本上是复制代码根据我的理解,最接近你所寻找的是:
class Book private constructor(): AbstractPersistable<Int>() {
constructor(
author: String? = null,
title: String? = null
) : this()
}
class Book私有构造函数():AbstractPersistable(){
建造师(
作者:字符串?=null,
标题:字符串?=null
):此()
}
基本上使主构造函数私有,并强制使用辅助构造函数
我想指出这一部分:
“这将类定义的焦点从继承转移到数据”
这实际上是科特林的意图之一,拥有比继承更多的成分。他们在语言中构建
by
的方式也是如此。似乎通过equals/hashCode困境给出了一个答案:不要将数据类用作Hibernate实体,而是出于另外一个原因。所以现在,你可以选择你的2。文体选择。问题有点广泛,所以请帮我。你希望它看起来怎么样,比如说用一种完美的未来语言?@deHaar:这个问题不是关于数据类的。我知道这篇博客文章,虽然作者选择不实现Spring数据的持久化,但他的方法与我所写的非常相似:字段优先,最后是超类。@AlexeySoshin:我使用的所有其他语言都将超类/接口放在类属性之前。理想情况下,我希望保持这种方式(就像在爪哇,C++,你可以这样命名),但是保持主构造函数的酷特性,就像Kotlin一样。