8 votes

Comment définir une méthode d'accès pour un paramètre de constructeur par défaut ?

Essayer de définir une méthode d'accès pour le paramètre par défaut du constructeur, c'est-à-dire :

class Person (age: Int) {
    def age: Int = this.age
}

Ce qui entraîne évidemment une erreur de compilation : référence ambiguë à une définition surchargée, la méthode age dans la classe Person de type => Int et la valeur age dans la classe Person de type Int correspondent toutes deux au type attendu Int

Existe-t-il un moyen, dans ce contexte, de faire la distinction entre le nom de la méthode du membre et le nom de la valeur du membre généré automatiquement ?

Il est bien sûr possible de modifier le nom de l'un ou l'autre identificateur, mais existe-t-il un moyen, dans ce scénario, de spécifier l'identificateur auquel il est fait référence ?

16voto

Randall Schulz Points 18820

Il suffit de mettre "val" devant les paramètres du constructeur que l'on souhaite exposer en tant que propriétés de l'instance.

6voto

nuriaion Points 1678

Utilisation

class Person (val age: Int)

si vous ne voulez qu'un getter ou

class Person (var age: Int)

si vous souhaitez également un setter.

3voto

Aaron Points 1744

Les réponses ci-dessus sont excellentes en ce qui concerne le principe de l'accès uniforme. Si vous avez besoin de getters et setters à la Java, vous pouvez également utiliser l'annotation BeanProperty.

class Person(@scala.reflect.BeanProperty var age: Int)

Les méthodes suivantes seront ainsi créées :

def getAge: Int = age
def setAge(age: Int) = this.age = age

Si vous utilisez la BeanProperty pour une val au lieu d'une var, le setter ne sera pas créé, mais seulement le getter.

Une autre mise en garde s'impose : la méthode setter ne peut pas être appelée depuis Scala. Au lieu de cela, vous devez utiliser la convention Scala standard d'accès uniforme pour définir la valeur.

1voto

Daniel L. Points 3047

Pour être complet et compléter les réponses précédentes, il y a aussi la technique couverte. aquí .

En résumé, je commencerais toujours par une valeur immuable :

class Person (val age: Int)

Ensuite, si vous vous rendez compte que vous devez muter la valeur (ou si vous le savez à l'avance), passez à :

class Person (var age: Int)

Ensuite, si vous avez besoin de valider ou de faire un autre calcul sur get ou set, renommez votre variable et construisez des accesseurs qui imitent votre dénomination originale, sans avoir besoin de refactoriser le reste du code :

class Person(var _age: Int)
{
   def age =
   {
      println("age requested")
      _age
   }
   def age_=(newAge: Int) =
   {
      assert(newAge > 0)
      println(s"age changed from ${_age} to $newAge")
      _age = newAge
   }
}

Bien entendu, vous pouvez simplifier le setter ou le getter si vous n'avez pas besoin d'opérations à ce niveau.

Bravo à toutes les autres réponses, qui sont effectivement correctes et qui sont arrivées bien plus tôt.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X