2011-06-30 12 views
5

想象一下:在運行時應用所有這些Scala特徵會產生什麼樣的影響?

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

是在myObject對象在運行時「組成的」,或者是Scala編譯器足夠聰明,在編譯時產生相應的代碼?如果您有多個地方應用上述代碼中的特徵,那麼它對代碼會產生怎樣的性能影響?

回答

11

它由在編譯時

的性狀將被添加爲接口到所得的類型,並從這些性狀的任何具體方法將(通常)被複制到其全部的類。

有時,編譯器可能必須通過代理靜態方法提供具體實現,但這不是通常的情況。

+2

我除了(S):這是要生活在一個單繼承(SI)的Java世界的價格:性狀必須*烤*因爲沒有辦法調整的SI方法解析順序(MRO)。 (這與Squeak ST中的特徵類似,但與Ruby中的特徵實際上改變了MRO的特徵大不相同)。這也意味着,改變性狀而無需重新編譯使用性狀可以導致一些頗爲有趣的情況下,該模塊......還是那句話,同樣可以說爲正常類。 – 2011-06-30 17:38:23

6

Scala會創建三個匿名類,(除了最後一個條件是語法錯誤)。

注意:這些類將使用訂單來命名,它們在其定義的範圍內定義。因此... OuterClass $ anon $ 1 - > 3.請避免在任何長期Java序列化中使用這些匿名類,因爲這會鎖定代碼中匿名類的順序。

除此之外,它是一個很棒的便利功能!

相關問題