Considere la siguiente clase escrito en Java:Scala miembros de la clase y los parámetros del constructor nombre choque
class NonNegativeDouble {
private final double value;
public NonNegativeDouble(double value) {
this.value = Math.abs(value);
}
public double getValue() { return value; }
}
Define un campo final llamado value
que se inicializa en el constructor, mediante la adopción de su parámetro llamado por igual y la aplicación de una función lo.
Quiero escribir algo similar en Scala. Al principio, he intentado:
class NonNegativeDouble(value: Double) {
def value = Math.abs(value)
}
Pero el compilador se queja: de error: sobrecarga necesidades de valor método resultan tipo
Obviamente el compilador piensa que la expresión value
dentro de la expresión Math.abs(value)
se refiere a que se define el método . Por lo tanto, el método que se está definiendo es recursivo, por lo que debo indicar su tipo de devolución. Entonces, el código que escribí no hace lo que esperaba: quería value
dentro de Math.abs(value)
para referirse al parámetro de constructor value
, y no al método que se está definiendo. Es como si el compilador hubiera agregado implícitamente this.
a Math.abs(this.value)
.
Agregar val
o var
(o private ...
variantes) al parámetro de constructor no parece ayudar.
Entonces, mi pregunta es: ¿puedo definir una propiedad con el mismo nombre como parámetro de constructor, pero tal vez con un valor diferente? ¿Si es así, cómo? Si no, ¿por qué?
Gracias!
Un constructor no se hace una propiedad a menos que sea una clase de caso o anotada con val o var. Sin embargo, está disponible para su uso en cualquier lugar dentro de la definición de la clase. –
¿Existe algún tipo de convención de nomenclatura de los parámetros del constructor en tales casos? –
@Bruno: hay varias convenciones de nombres; A mí personalmente me gusta el que se agrega un 0 al nombre, ya que ese cero implica un punto de partida, y es breve. (A veces se anexan o anexan guiones bajos, pero personalmente siento que ya hay muchos guiones bajos). –