Scala-Klasse-Mitglieder und Konstruktor-Parameter name clash

Betrachten Sie die folgende Klasse in Java geschrieben:

class NonNegativeDouble {
    private final double value;
    public NonNegativeDouble(double value) {
        this.value = Math.abs(value);
    }
    public double getValue() { return value; }
}

Es wird ein final-Feld namens value ist, dass die Initialisierung im Konstruktor, indem Sie den parameter namens gleich und anwenden einer Funktion auf es.

Möchte ich etwas schreiben, so ähnlich wie es in Scala. Auf den ersten, habe ich versucht:

class NonNegativeDouble(value: Double) {
  def value = Math.abs(value)
}

Aber der compiler meckert: Fehler: überladene Methode Wert muss der Ergebnistyp

Offensichtlich ist der compiler denkt, dass der Ausdruck value im inneren der Ausdruck Math.abs(value) bezieht sich auf die Methode definiert wird. Also, die Methode definiert ist rekursiv, also muss ich die zurück geben. Also, der code, den ich schrieb, der nicht tut, was ich erwartet hatte, es zu tun: ich wollte value innen Math.abs(value) beziehen sich auf die Konstruktor-parameter value, und nicht auf die Methode definiert wird. Es ist, als ob der compiler implizit Hinzugefügt this. zu Math.abs(this.value).

Hinzufügen val oder var (oder private ... Varianten), um die parameter des Konstruktors nicht scheinen zu helfen.

So, meine Frage ist: kann ich definieren, eine Eigenschaft mit dem gleichen Namen wie ein parameter des Konstruktors, aber vielleicht einen anderen Wert? Wenn ja, wie? Wenn nicht, warum?

Dank!

InformationsquelleAutor Bruno Reis | 2010-09-22
Schreibe einen Kommentar