Considérez la classe suivante écrite en Java:
class NonNegativeDouble {
private final double value;
public NonNegativeDouble(double value) {
this.value = Math.abs(value);
}
public double getValue() { return value; }
}
Elle définit un champ final appelé value
qui est initialisé dans le constructeur, en prenant son paramètre appelé de manière similaire et en lui appliquant une fonction.
Je veux écrire quelque chose de similaire en Scala. Au début, j'ai essayé:
class NonNegativeDouble(value: Double) {
def value = Math.abs(value)
}
Mais le compilateur se plaint: error: overloaded method value needs result type
Évidemment, le compilateur pense que l'expression value
à l'intérieur de l'expression Math.abs(value)
se réfère à la méthode en cours de définition. Par conséquent, la méthode en cours de définition est récursive, donc je dois indiquer son type de retour. Ainsi, le code que j'ai écrit ne fait pas ce que j'attendais : je voulais que value
à l'intérieur de Math.abs(value)
se réfère au paramètre du constructeur value
, et non à la méthode en cours de définition. C'est comme si le compilateur ajoutait implicitement un this.
à Math.abs(this.value)
.
Ajouter val
ou var
(ou des variantes private ...
) au paramètre du constructeur ne semble pas aider.
Donc, ma question est : puis-je définir une propriété avec le même nom qu'un paramètre de constructeur, mais peut-être une valeur différente? Si oui, comment? Sinon, pourquoi?
Merci!