2011-06-30 8 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オブジェクトである、またはコンパイル時に適切なコードを生成するのに十分なスマートS​​calaのコンパイラですか?上記のコードのような特性を適用する複数の場所がある場合、コードにどのようなパフォーマンスの影響がありますか?

答えて

11

それは形質が得られるタイプのインタフェースとして追加され、それらの特徴から任意の具体的な方法は、(通常は)その全体がクラスにコピーされ、コンパイル時に

を構成です。

時々、コンパイラは、静的メソッドへのフォワーダを使用して具体的な実装を提供する必要がありますが、これは通常そうではありません。

+2

追加情報:SI(Single Inheritance)Javaワールドで生活するために支払う代金です。SIメソッド解決順序(MRO)を調整する方法がないため、特性を*で焼く必要があります。 (これはSqueak STの特性と似ていますが、実際にMROを変更するRubyの特性とは大きく異なります)。これはまた、形質を使用してモジュールを再コンパイルせずに形質を変更すると、いくらか面白い状況につながる可能性があることを意味します...再び、通常のクラスについても同じことを論じることができます。 –

6

Scalaは3つの匿名クラスを作成します(ただし、最後の条件は構文エラーです)。

注:これらのクラスの名前は、という名前で定義され、定義されているスコープ内で定義されます。 OuterClass $ anon $ 1 - > 3.これらの匿名クラスは、コード内の匿名クラスの順序をロックするので、長期のJavaシリアライゼーションでは使用しないでください。

それ以外は、便利な機能です!

関連する問題