1
votes

Classe de données Kotlin avec des propriétés supplémentaires non dans le constructeur

Commencer avec Kotlin et vouloir créer une classe de données

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;
    }
}

Mais disons que je veux ajouter des propriétés supplémentaires que je ne connais pas au moment où j'utilise le constructeur mais Je veux stocker ces données plus tard lorsque j'en suis conscient, par exemple l'humeur d'une personne (représentée sous forme de chaîne)

En Java, je créerais une classe de données comme celle-ci. Je pourrais ne pas l'inclure dans le constructeur et créer un getter où je pourrais le définir plus tard.

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

Kotlin ne semble pas avoir de réponse sur ou si c'est le cas, je ne sais pas comment formuler correctement. D'où la raison pour laquelle on peut déjà répondre à cette question et je suis incapable de la trouver.

Je comprends qu'en n'incluant pas l'humeur dans la ligne de classe de données, Kotlin peut ne pas être en mesure d'identifier l'humeur dans le cadre de la classe de données mais à part l'inclure dans le constructeur et le mettre à null, je ne sais pas quoi faire d'autre ou est-ce ce que je suis censé faire?


0 commentaires

5 Réponses :


7
votes

Vous devriez pouvoir simplement l'ajouter en tant que propriété à Person . Dans Kotlin, une classe de données est toujours une classe, elle vient juste avec quelques extras (toString, copier les constructeurs, hashCode / equals, etc.). Vous pouvez toujours définir les propriétés de votre choix.

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

Dans ce cas, il est nullable, car comme vous l'avez dit, vous ne connaîtrez peut-être l'ambiance que plus tard.


0 commentaires

2
votes

La classe de données de Kotlin doit avoir le premier constructeur, vous pouvez l'éviter en n'utilisant pas le mot-clé data .

Si vous souhaitez toujours ajouter une autre propriété aux données classe, vous pouvez faire ce qui suit:

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

De cette façon, vous pouvez faire person.mood = "happy" sans l'inclure dans le constructeur. p>


0 commentaires

2
votes

Kotlin ne prend en compte les valeurs transmises au constructeur principal qu'en ce qui concerne les fonctionnalités "gratuites" fournies par une classe Data. Au-delà de cela, vous pouvez ajouter les propriétés supplémentaires de votre choix, mais elles ne sont pas prises en compte dans le code spécial que Kotlin écrit en marquant une classe comme data .

Selon les documents Kotlin:

Notez que le compilateur utilise uniquement les propriétés définies dans le constructeur principal pour les fonctions générées automatiquement. À exclure une propriété des implémentations générées, déclarez-la à l'intérieur du corps de la classe:

Par conséquent, déclarer des propriétés en dehors du constructeur principal présente en fait des avantages. Vous pourrez peut-être déclarer une propriété via le constructeur principal, mais choisissez de ne pas le faire.

Non seulement vous devez fournir un constructeur principal, mais il doit inclure au moins une déclaration de propriété. Si vous ne le faisiez pas, il n'y aurait aucun avantage à faire de la classe une classe data . Mais marquer une classe ne limite pas ce que vous pouvez faire d'autre avec cette classe.


0 commentaires

2
votes

Avez-vous essayé:

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


0 commentaires

1
votes

Une alternative aux réponses de @ Todd et @ jingx est

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

La différence est que de cette façon, mood participe à toString / est égal à / hashCode / copy et que vous pouvez définir humeur dans l'appel du constructeur. Même si ce n'est probablement pas souhaitable dans ce cas précis, cela peut être utile dans d'autres.


0 commentaires