Конструктор Kotlin от доступа к конструктору Java Super Class - PullRequest
0 голосов
/ 27 апреля 2018

Я не думаю, что мой заголовок может быть более запутанным. Я интегрирую Kotlin в существующий проект Java. У меня есть класс Java в основном определяется так:

class EntityBase {
   private Long id;

   public EntityBase() { }
   public EntityBase(Long id) { this.id = id; }
}

Затем я определил класс данных Kotlin следующим образом, и я пытаюсь гидрировать этот объект из DTO, используя сопутствующий метод, но я не могу получить доступ к EntityBase.id из этого метода посредством создания объекта:

data class Thing(
   val name: String,
   val desc: String
) : EntityBase() {

  companion object {

    fun fromDto(dto: ThingDto) = Thing(
       name = dto.name,
       desc = dto.desc
       id = dto.id // this doesn't work because id isn't part of Thing's constructor
    )

}

Я могу обойти это, используя конструкторы вместо сопутствующих объектов, но мне любопытно, есть ли способ сделать это, о котором я просто не знаю. Все еще довольно плохо знаком с Kotlin.

1 Ответ

0 голосов
/ 27 апреля 2018

Вам нужно добавить id в ваш конструктор и передать его конструктору базового класса при расширении.

private data class Thing(
        val name: String,
        val desc: String,
        val id: Long
) : EntityBase(id) {

    companion object {
        fun fromDto(dto: ThingDto) = Thing(
                name = dto.name,
                desc = dto.desc,
                id = dto.id 
        )
    }
}

Это то, что вы подразумеваете под "использованием конструкторов"? Если вы не хотите иметь конструкторы, вы должны использовать геттеры / сеттеры в вашем базовом классе ( NOTE Я бы не рекомендовал следующее, показанное для иллюстрации) -

class EntityBase {
   private Long id;

   public EntityBase() { }
   public EntityBase(Long id) { this.id = id; }
   public void setId(Long id) { this.id = id; }
   public Long getId() { return id; }
}

Тогда вы можете сделать -

private data class Thing(
        val name: String,
        val desc: String
) : EntityBase() {

    companion object {

        fun fromDto(dto: ThingDto) : Thing {
            val thing = Thing(
                    name = dto.name,
                    desc = dto.desc)
            thing.id = dto.id;
            return thing;
        }

    }
}

Тогда вы не связываете конструкторы, но это имеет большой недостаток - id не является частью класса данных, toString, copy, equals и т. Д. Будут генерироваться только со значениями в конструкторе класса data. Если вы вызовете toString для объекта, используя вышеуказанное, вы увидите, что он использует только name и desc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...