2012-10-19 19 views
6

Czy mogę przekazywać argumenty do konstruktora klasy Scala, które nie są przechowywane w samej klasie? chcę osiągnąć funkcjonalność, która w Javie można zapisać następująco:Parametry lokalnego konstruktora klasy Scala

class A { 
    private final SomethingElse y; 
    public A(Something x) { 
      y = x.derive(this); 
    } 
} 

Tj konstruktor klasy przyjmuje parametr, który jest później transformowany do innej wartości za pomocą odwołania do this. Parametr zostanie zapomniany po zwróceniu konstruktora.

W Scala mogę zrobić:

class A(x: Something) { 
    val y = x.derive(this) 
} 

Ale to znaczy, że x jest przechowywany w klasie, który chcę uniknąć. Ponieważ metoda x.derive używa odwołania do this, nie mogę dokonać transformacji w obiekcie towarzyszącym.

Odpowiedz

7

Ale to oznacza, że ​​x jest przechowywane w klasie, której chcę uniknąć.

Jeśli nie odwołasz się do argumentu konstruktora w dowolnym miejscu z wyjątkiem samego konstruktora, pole nie zostanie utworzone. Jeśli odwołasz się do x, np. w toString(), Scala automatycznie utworzy i przypisze Ci prywatny val.

Użyj javap -c -private A, aby sprawdzić, jaki rodzaj pól jest rzeczywiście tworzony.

BTW mijamy this wewnątrz konstruktora, co oznacza, że ​​ otrzymuje odwołanie do potencjalnie niezainicjowanej instancji A. Bądź ostrożny!

Powiązane problemy