2011-06-30 7 views
5

Wyobraź sobie:Jaki wpływ ma stosowanie wszystkich tych cech Scala w czasie wykonywania?

val myObject = if(someCondition) { 
    new Whatever with Trait1 
} else if(otherCondition) { 
    new Whatever with Trait2 with Trait3 with Trait4 
} else { 
    new Whatever with Trait5 
} 

jest przedmiotem myObject „złożony” w czasie wykonywania, czy kompilator Scala wystarczająco inteligentny, aby wygenerować odpowiedni kod w czasie kompilacji? Jaki wpływ na wydajność ma kod, jeśli masz wiele miejsc, które stosują cechy, jak w powyższym kodzie?

Odpowiedz

11

To składa się w czasie kompilacji

Te cechy zostaną dodane jako interfejsy do otrzymanej typu i jakiekolwiek konkretne sposoby będą z tych cech (zazwyczaj) skopiowane do klasy w całości.

Czasami kompilator może wymagać konkretnych implementacji za pośrednictwem usług przesyłania dalej do metod statycznych, ale zazwyczaj tak się nie dzieje.

+2

Moje dodatki: Jest to cena, jaką należy zapłacić za życie w świecie Java Dziedzictwo Pojedyncze: Cechy muszą być * pieczone w *, ponieważ nie ma sposobu na dostosowanie Rozkazu Rozdzielczości Metody SI (MRO). (Jest to podobne do cech w Squeak ST, ale znacznie różni się od cech Ruby, które faktycznie zmieniają MRO). Oznacza to również, że zmiana cechy bez rekompilacji modułu za pomocą cechy może prowadzić do dość ciekawych sytuacji ... to samo można argumentować za normalną klasą. –

6

Scala utworzy trzy anonimowe klasy (z wyjątkiem ostatniego warunku jest błąd składni).

Uwaga: Te klasy zostaną nazwane przy użyciu zamówienia, w którym są zdefiniowane w zakresie, w jakim zostały zdefiniowane. A więc ... OuterClass $ anon $ 1 -> 3. Proszę unikać używania tych anonimowych klas w długoterminowej serializacji Java, ponieważ blokuje to kolejność anonimowych klas w kodzie.

Poza tym jest to niesamowita wygoda!

Powiązane problemy