2017-08-14 2 views
1

J'ai créé une classe qui a un champ d'exemple dans KotlinChamp d'initialisation avec getter et setter?

class SomeClass { 
    var smth: String = "Initial value" 
      get() = "Here it is" 
      set(value) { 
       field = "it is $value" 
      } 
} 

Lorsque je crée un objet de la classe et appelle le domaine smth, il appellera la get() propriété de toute façon. Donc, la question est: pourquoi devons-nous initialiser un champ qui a getter?

var smth: String // Why this gives error? 
     get() = "Here it is" 
     set(value) { 
      field = "it is $value" 
     } 

Il retournera toujours la valeur de la propriété get(), non?

+1

parce que Kotlin ne générera aucun champ de sauvegarde en utilisant 'get() = ...' sans aucune valeur initialisée. par exemple: 'val smth: String get() =" Ici c'est "' –

Répondre

2

Je pense que c'est parce que le compilateur est pas assez intelligent pour en déduire que ce n'est pas nulle.

En fait, un code très similaire présenté dans le document officiel ici https://kotlinlang.org/docs/reference/properties.html

var stringRepresentation: String 
    get() = this.toString() 
    set(value) { 
     setDataFromString(value) // parses the string and assigns values to other properties 
    } 

Apparemment, ce code ne compile pas non plus à moins qu'un constructeur comme

constructor(stringRepresentation: String) { 
    this.stringRepresentation = stringRepresentation 
} 

est ajouté.

+0

"set (value: String) {' work? – EpicPandaForce

3

Vous avez le soutien champ field dans setter, nous devons donc initialiser, Voir ce reference