Рассмотрим следующий класс, написанный на Java:
class NonNegativeDouble {
private final double value;
public NonNegativeDouble(double value) {
this.value = Math.abs(value);
}
public double getValue() { return value; }
}
Он определяет конечное поле с именем value
, которое инициализируется в конструкторе, принимая его параметр с именем alike и применяя к нему функцию.
Я хочу написать что-то подобное в Scala. Сначала я попробовал:
class NonNegativeDouble(value: Double) {
def value = Math.abs(value)
}
Но компилятор жалуется: ошибка: перегруженное значение метода требует тип результата
Очевидно, что компилятор считает, что выражение value
внутри выражения Math.abs(value)
относится к определяемому методу. Поэтому определяемый метод является рекурсивным, поэтому мне нужно указать его тип возвращаемого значения. Итак, код, который я написал, не делает то, что ожидал: я хотел, чтобы value
внутри Math.abs(value)
ссылался на параметр конструктора value
, а не на определяемый метод. Это как если бы компилятор неявно добавил this.
к Math.abs(this.value)
.
Добавление val
или var
(или private ...
вариантов) к параметру конструктора, похоже, не помогает.
Итак, мой вопрос: могу ли я определить свойство с тем же именем, что и у параметра конструктора, но, возможно, с другим значением? Если так, то как? Если нет, то почему?
Спасибо!