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