2011-07-09 1 views
19

Khi tôi đang thiết kế các đối tượng không thay đổi, các kiểu chữ thường vô cùng tiện dụng vì phương thức tự động tạo ra copy.'bản sao' cho các trường hợp không phải là trường hợp?

Nhưng trường hợp lớp học có vấn đề riêng của họ: họ không nên được thừa hưởng từ và họ cung cấp cho bạn một vắt ngay cả khi bạn không muốn một.

Vì vậy, đôi khi tôi phải sử dụng một lớp Scala trong vườn. Vấn đề là sau đó tôi phải viết API bất biến của riêng tôi, có thể khá lặp đi lặp lại:

class Debt(principalBalance: Double, name: String, endDate: LocalDate) { 
    def withNewPrincipalBalance(bal: Double) = new Debt(bal, name, endDate) 
} 

Có cách nào để mở rộng hơn không? Có một plugin trình biên dịch tôi có thể sử dụng?

+2

xem http://stackoverflow.com/q/3900307/203968 – oluies

Trả lời

31

Tôi không biết về plugin trình biên dịch, nhưng bạn có thể xác định phương thức copy giống như phương thức được tạo trong trường hợp các lớp sử dụng đối số được đặt tên kết hợp với đối số mặc định.

class Debt(principalBalance: Double, name: String, endDate: LocalDate) { 
    def copy(principalBalance: Double = principalBalance, 
      name: String = name, 
      endDate: LocalDate = endDate) = new Debt(principalBalance, name, endDate) 
} 

Đây không phải là lặp đi lặp lại như các phương pháp riêng cho từng tài sản (withNewPrincipalBalance) và làm cho nó có thể để không cho phép thay đổi các giá trị nhất định (ví dụ ngày tạo).