我正在使用 Maven 编写 Spring Boot 应用程序。但最近我将 JDK 升级到 10,Lombok stable 停止使用它。我认为这将是开始使用 Kotlin 的一个很好的借口。但我对带有 Spring Boot 应用程序的 Kotlin 数据类的外观不满意。
Java 示例:
@Data
@Entity
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(exclude = {"creator", "content"})
public class Document {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
private String id ;
@Size(min = 4, max = 100)
private String name;
@ManyToOne
@Column(updatable = false)
private User creator;
@OneToOne(cascade = CascadeType.ALL)
private Content content;
@ManyToOne
private Project project;
@NotNull
@Column(updatable = false)
@JsonFormat(pattern = "yyyy/MM/dd hh:mm:ss")
private LocalDateTime creationDate;
@NotNull
@LastModifiedDate
@JsonFormat(pattern = "yyyy/MM/dd hh:mm:ss")
private LocalDateTime lastModified;
@ManyToOne
@LastModifiedBy
private User modificator;
}
Kotlin 示例:
@Entity
data class Document(@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
val id: String,
@Size(min = 4, max = 100)
val name: String,
@ManyToOne
@JoinColumn(updatable = false)
private val creator: User,
@OneToOne(cascade = arrayOf(CascadeType.ALL))
private val content: Content,
@ManyToOne
@JoinColumn(updatable = false)
val project: Project,
@NotNull
@Column(updatable = false)
@JsonFormat(pattern = "yyyy/MM/dd hh:mm:ss")
val creationDate: LocalDateTime,
@NotNull
@LastModifiedDate
@JsonFormat(pattern = "yyyy/MM/dd hh:mm:ss")
private val lastModified: LocalDateTime,
@ManyToOne
@LastModifiedBy
private val modificator: User
)
这使得我的代码真的不可读。您有如何编写 Spring Boot 数据类的模板吗?或者如何利用 Kotlin 的所有优点将现有 Java 类转换为 Kotlin?
我正在使用 IntelliJ Idea Community 版本 2018.1。或者也许您有更好的想法来像模型类一样持久保存 Lombok?
最佳答案
Kotlin 数据类提供了 POJO 无法达到的简洁性和效率。我在我的工作项目中广泛使用了您正在寻找的这种模式。
而且,是的,它们看起来很相似。但是,您的代码中存在一些效率低下的地方,可以很容易地绕过。例如,当语言内置了可空性注释时,它就没有任何意义。
这是我的一个项目类,作为实际使用的示例:
@Entity
@Table(name = "Acks")
data class AckEntity(
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Int = 0,
@Enumerated(EnumType.STRING)
val ackType: AckType,
@OneToOne(cascade = [CascadeType.ALL], fetch = FetchType.EAGER)
@JoinColumn(name = "alert")
val alert: AlertEntity,
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn
val session: SessionEntity? = null,
@Embedded
val sale: SaleEntity?,
val version: Int,
val timestamp: Date?) : DataEntity
与这些类过去在 Java 中的外观相比,我想说这绝对是一种更简洁的方法。
但是,可能需要一些时间才能习惯 Kotlin 的工作方式。一旦你学会了如何快速阅读该语言,我想你会发现你的效率大大提高。我知道我做到了。
关于Java -> Kotlin。数据类转换模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50212457/