2011-06-30 13 views
5

Hãy tưởng tượng này:Loại tác động nào áp dụng tất cả các đặc điểm Scala này trong thời gian chạy?

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

là đối tượng myObject "sáng tác" trong thời gian chạy, hoặc là trình biên dịch scala đủ thông minh để tạo mã thích hợp ở thời gian biên dịch? Loại tác động hiệu suất nào sẽ có trên mã nếu bạn có nhiều địa điểm áp dụng các đặc điểm như trong mã ở trên?

Trả lời

11

Nó bao gồm tại thời gian biên dịch

Các đặc điểm sẽ được thêm vào như là giao diện với các loại kết quả, và bất kỳ phương pháp bê tông từ những đặc điểm sẽ (thường) được sao chép vào lớp một cách trọn vẹn.

Thỉnh thoảng, trình biên dịch có thể phải cung cấp triển khai cụ thể thông qua giao nhận cho phương pháp tĩnh, nhưng điều này thường không xảy ra.

+2

Ngoài ra: Đó là giá phải trả để sinh sống trong Thế giới Java đơn thừa (SI): Các đặc điểm phải được * nướng trong * vì không có cách nào để điều chỉnh Thứ tự độ phân giải phương pháp SI (MRO). (Điều này tương tự như các đặc điểm trong Squeak ST nhưng khác nhiều so với các đặc điểm trong Ruby thực sự làm thay đổi MRO). Điều này cũng có nghĩa là thay đổi một đặc điểm mà không biên dịch lại mô-đun bằng cách sử dụng đặc điểm có thể dẫn đến một số tình huống khá thú vị ... sau đó một lần nữa, điều tương tự có thể được lập luận cho các lớp bình thường. –

6

Scala sẽ tạo ba lớp ẩn danh, (ngoại trừ điều kiện cuối cùng là lỗi cú pháp).

Lưu ý: Các lớp này sẽ được đặt tên theo đơn đặt hàng mà chúng được xác định trong phạm vi chúng được xác định. Vì vậy ... OuterClass $ anon $ 1 -> 3. Vui lòng tránh sử dụng các lớp ẩn danh này trong bất kỳ serialization Java dài hạn nào vì điều này sẽ khóa thứ tự các lớp ẩn danh trong mã của bạn.

Ngoài ra, đây là một tính năng tiện lợi tuyệt vời!

Các vấn đề liên quan