Java -> Kotlin。数据类转换模式

标签 java spring spring-boot kotlin spring-data

我正在使用 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/

相关文章:

java - 检查文件扩展名是否为 .txt 的程序

java - 如何使用 Gitlab CI 构建 Java Maven 项目?

java - spring-boot:数据库中断后jdbc重新连接

spring-boot - 在 Spring Boot 中将 application.properties 文件加载到 java.util.Properties

用于 YAML 到 JAXB 映射的 Java 库

java - Spring boot发送RequestBody和RequestParam

java - 如何从android中的谷歌应用引擎数据存储中获取数据

java - 如何在java-spring应用程序中并行调用多个soap调用

java - 单独模块中使用的 Spring AOP 切面

java - 使用 Spring Cloud Streams 测试错误流