Класс данных Kotlin с дополнительными свойствами не в конструкторе - PullRequest
0 голосов
/ 11 апреля 2019

Начиная с Kotlin и желая создать класс данных

data class Person(val Email: String, val firstName: String, val lastName: String)

Но скажем, я хочу добавить дополнительные свойства, которые я не знаю в то время, когда я использую конструктор, но я хочучтобы сохранить эти данные на более позднем этапе, когда я узнаю об этом, например, о настроении человека (представленном в виде строки)

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

public class Person{

     private String email;
     private String firstName;
     private String lastName;
     private String mood;

     public person (String email, String firstName, String lastName){
      this.email = email;
      this.firstName = firstName;
      this.lastName = lastName;
    } 

    public setMood(String mood){
     this.mood = mood;
    }
}

У Котлина, похоже, нет ответа на этот вопрос, или если он мнене знаю, как правильно сформулировать.Следовательно, почему на этот вопрос уже можно было ответить, и я не могу его найти.

Я понимаю, что, не включив настроение в строку класса данных, Kotlin, возможно, не сможет определить настроение как часть класса данных, нопомимо включения его в конструктор и установки его в null, я не уверен, что еще делать или это то, что я должен делать?

Ответы [ 5 ]

6 голосов
/ 11 апреля 2019

Вы можете просто добавить его как свойство к Person.В Kotlin класс данных по-прежнему является классом, он просто поставляется с некоторыми дополнениями (toString, конструкторы копирования, hashCode / equals и т. Д.).Вы по-прежнему можете определять любые свойства, которые вам нужны.

data class Person(val Email: String, val firstName: String, val lastName: String) {
    var mood: String? = null
}

В этом случае он может быть обнуляемым, потому что, как вы заявили, вы можете не знать настроение позже.

2 голосов
/ 11 апреля 2019

Вы пробовали:

data class Person(val Email: String, val firstName: String, val lastName: String) {
    var mood: String? = null
}
2 голосов
/ 11 апреля 2019

Kotlin рассматривает только значения, переданные первичному конструктору, с точки зрения предоставления вам «бесплатных» функций, которые предоставляет класс Data.Кроме того, вы можете добавить любые дополнительные свойства, которые пожелаете, но они не учитываются в специальном коде, который Котлин пишет, когда вы помечаете класс как data.

Согласно документации Kotlin:

Обратите внимание, что компилятор использует свойства, определенные внутри основного конструктора, для автоматически сгенерированных функций.Чтобы исключить свойство из сгенерированных реализаций, объявите его внутри тела класса:

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

Мало того, что вы должны предоставить первичный конструктор, но оно должно включать как минимум одно объявление свойства.Если вы этого не сделаете, то сделать класс классом data не принесет никакой пользы.Но пометка класса не ограничивает то, что еще можно сделать с этим классом.

2 голосов
/ 11 апреля 2019

Класс данных Kotlin должен иметь первый конструктор, вы можете избежать этого, не используя ключевое слово data.

Если вы все еще хотите добавить другое свойство в класс данных, вы можетевыполните следующие действия:

data class Person(val email: String, val firstName: String, val lastName: String){
    var mood: String = ""
}

Таким образом, вы можете сделать person.mood = "happy" без включения его в конструктор.

0 голосов
/ 12 апреля 2019

Альтернативой ответам @ Тодда и @ jingx является

data class Person(val Email: String, val firstName: String, val lastName: String, var mood: String? = null)

Разница в том, что таким образом mood участвует в toString / equals / hashCode / copy и чтоВы можете установить mood в вызове конструктора.Даже если это, вероятно, нежелательно для этого конкретного случая, это может быть полезно в других.

...