2010-01-07 27 views
8

Tôi có câu hỏi khá đơn giản về Scala. Cho rằng tôi phải định nghĩa lớp sau:Làm cách nào để hiển thị biến của hàm tạo (sic!) Dưới dạng chỉ đọc?

class Foo(var bar: Int) 

Mã có khả năng xây dựng một thể hiện của Foo phải có khả năng vượt qua các giá trị ban đầu cho bar. Nhưng nếu tôi xác định barvar Người dùng cũng có thể thay đổi giá trị của nó khi chạy không phải là điều tôi muốn. Người dùng chỉ có thể đọc bar. bar chính nó được sửa đổi nội bộ để một val không phải là một lựa chọn.

Trả lời

13

Chỉ đọc cho một thuộc tính thật dễ dàng, chỉ cần tạo phương thức getter mà không có trình đặt tương ứng. Thật dễ dàng để tạo một trường có thể sửa đổi riêng tư.

thách thức lớn nhất của bạn ở đây là không gian tên chia sẻ, bạn muốn để có thể sử dụng cùng tên cho:

  • các nhà xây dựng param
  • lĩnh vực sửa đổi nội
  • getter công
  • thiết lập riêng tư

Đáng buồn thay, điều này là không thể, và bạn cần một tên riêng cho mỗi vai trò ... mething như thế này:

class Bippy(bop0: Int) { 
    private[this] var privatebop = bop0 
    //privatebop is ONLY EVER used by the following getter and setter: 
    private def bop_=(x:Int) = privatebop = x 
    def bar = privatebop 
} 

Nếu bạn không quan tâm về việc sử dụng đối số được đặt tên, hoặc với tên của các đối số trong Scaladoc, thì đây có thể được rút ngắn hơn nữa:

class Bippy(private[this] var privatebop) { 
    //privatebop is ONLY EVER used by the following getter and setter: 
    private def bop_=(x:Int) = privatebop = x 
    def bop = privatebop 
} 

CẬP NHẬT

Phương pháp sạch nhất, được cho là, mang lại cho bạn các thông số được đặt tên là kết hợp một nhà máy với một trong các kỹ thuật trên:

object Bippy{ 
    def apply(bop: Int) = new Bippy(bop) 
} 

Mà sau đó có thể được gọi là Bippy(42). Cũng giống như hàm tạo thông thường, nhưng không có từ khóa new.

+0

Câu trả lời hay, cảm ơn bạn rất nhiều! – Malax

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