【问题标题】:Java -> Kotlin. Data classes conversion patternJava -> Kotlin。数据类转换模式
【发布时间】:2018-10-17 03:45:39
【问题描述】:

我正在用 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 社区版 2018.1。或者你有更好的主意来像模型类一样持久化 Lombock?

【问题讨论】:

  • 我看不出有什么区别,除了你的空格分号选择。
  • 两者都不可读,但这是另一个讨论的主题(注释通常会使代码不可读,这是显而易见的不幸事实)。
  • 为什么你认为它不可读?您可以在变量之间添加更多空格。它将与您的 Java 代码非常相似
  • 如果您不喜欢它的外观,您不必将 Model 类转换为 Kotlin。 Kotlin 可以选择 .java 类。
  • 正如@ChirdeepTomar 提到的,Kotlin 支持与 Java 的互操作性。除非您需要重写此代码,否则只需按原样使用该类即可节省资源 - 不要浪费本可用于其他领域的宝贵时间。

标签: java spring spring-boot kotlin spring-data


【解决方案1】:

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 的工作方式。不过,一旦你学会了如何快速阅读这门语言,我想你会发现你的效率会大大提高。我知道我做到了。

【讨论】:

    【解决方案2】:

    如果您不喜欢它的外观,则不必将 Model 类转换为 Kotlin。 Kotlin 只能选择 .java 类。否则,您可以执行类似的操作,顺便说一句,这只是 intelliJ 中的自动转换。

    @Data
    @Entity
    @NoArgsConstructor
    @AllArgsConstructor
    @EqualsAndHashCode(exclude = { "creator", "content" })
    class Document {
    
        @Id
        @GeneratedValue(generator = "uuid2")
        @GenericGenerator(name = "uuid2", strategy = "uuid2")
        var id: String? = null
            set(id) {
                field = this.id
            }
    
        @Size(min = 4, max = 100)
        var name: String? = null
            set(name) {
                field = this.name
            }
    
        @ManyToOne
        @Column(updatable = false)
        var creator: User? = null
            set(creator) {
                field = this.creator
            }
    
        @OneToOne(cascade = CascadeType.ALL)
        var content: Content? = null
            set(content) {
                field = this.content
            }
    
        @ManyToOne
        var project: Project? = null
            set(project) {
                field = this.project
            }
    
        @NotNull
        @Column(updatable = false)
        @JsonFormat(pattern = "yyyy/MM/dd hh:mm:ss")
        var creationDate: LocalDateTime? = null
            set(creationDate) {
                field = this.creationDate
            }
    
        @NotNull
        @LastModifiedDate
        @JsonFormat(pattern = "yyyy/MM/dd hh:mm:ss")
        var lastModified: LocalDateTime? = null
            set(lastModified) {
                field = this.lastModified
            }
    
        @ManyToOne
        @LastModifiedBy
        var modificator: User? = null
            set(modificator) {
                field = this.modificator
            }
    }
    

    【讨论】:

    • 这种自动转换并没有完成令人难以置信的工作。有很多不必要的冗长。看我的回答;这是一个人工编写的 Kotlin Spring-Data 实体数据类,我会说它看起来很干净。你同意吗?
    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多