Ява -> Котлин. Шаблон преобразования классов данных - PullRequest
0 голосов
/ 07 мая 2018

Я пишу приложение Spring Boot с Maven. Но недавно я обновил JDK до 10, и Lombok stable перестал работать с ним. Я решил, что это будет отличным оправданием, чтобы начать использовать Kotlin. Но меня не устраивает внешний вид классов данных 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
)

, что делает мой код действительно нечитаемым. У вас есть какой-нибудь шаблон для написания весенних загрузочных классов данных? Или как преобразовать существующие классы Java в Kotlin, используя все преимущества Kotlin?

Я использую IntelliJ Idea Community Edition 2018.1. Или, может быть, у вас есть лучшая идея сохранить Lombock, как классы моделей?

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Классы данных 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, я бы сказал, что это более чистый подход.

Однако может потребоваться некоторое время, чтобы привыкнуть к тому, как Котлин делает вещи. Однако, как только вы научитесь быстро читать язык, вы заметите, что ваша эффективность немного повысится. Я знаю, что сделал.

0 голосов
/ 08 мая 2018

Вам не нужно конвертировать классы 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
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...