2010-11-26 2 views

Trả lời

14

Đối với một điều này cho phép hoán đổi một var/val công cộng với (một vài) def (s) và vẫn duy trì khả năng tương thích nhị phân. Thứ hai, nó cho phép ghi đè một var/val trong các lớp dẫn xuất.

10

Trước tiên, giữ cho trường công khai cho phép khách hàng đọc và viết trường. Vì nó có lợi để có các đối tượng bất biến, tôi khuyên bạn nên làm cho trường chỉ đọc (mà bạn có thể đạt được trong Scala bằng cách tuyên bố nó là "val" chứ không phải là "var").

Bây giờ, hãy quay lại câu hỏi thực tế của bạn. Scala cho phép bạn xác định những người định cư và getters của riêng bạn nếu bạn cần nhiều hơn các phiên bản tầm thường. Điều này rất hữu ích để duy trì bất biến. Đối với người định cư, bạn có thể muốn kiểm tra giá trị mà trường được đặt thành. Nếu bạn giữ chính trường đó, bạn không có cơ hội để làm như vậy.

Điều này cũng hữu ích cho các trường được khai báo là "val". Giả sử bạn có một trường kiểu Mảng [X] để biểu diễn trạng thái bên trong của lớp của bạn. Một khách hàng bây giờ có thể có được một tham chiếu đến mảng này và sửa đổi nó - một lần nữa bạn không có cơ hội để đảm bảo bất biến được duy trì. Nhưng kể từ khi bạn có thể xác định getter của riêng bạn, bạn có thể trả lại một bản sao của mảng thực tế.

Đối số tương tự áp dụng khi bạn tạo trường tham chiếu "công khai cuối cùng" trong Java - khách hàng không thể đặt lại tham chiếu nhưng vẫn sửa đổi đối tượng mà điểm tham chiếu đến.

Trên ghi chú liên quan: truy cập trường thông qua getters trong Scala trông giống như truy cập trực tiếp vào trường. Điều tốt đẹp về điều này là nó cho phép truy cập vào một trường và gọi một phương thức mà không có các tham số trên đối tượng trông giống như vậy. Vì vậy, nếu bạn quyết định không muốn lưu trữ giá trị trong một trường nữa, nhưng tính toán nó ngay lập tức, khách hàng không phải quan tâm vì nó trông giống như điều đó với anh ta - điều này được gọi là Uniform Access Principle

8

Tóm lại: Nguyên tắc truy cập đồng nhất.

Bạn có thể sử dụng giá trị val để triển khai phương thức trừu tượng từ siêu lớp. Hãy tưởng tượng định nghĩa sau đây từ một số gói đồ họa tưởng tượng:

abstract class circle { 
    def bounds: Rectangle 
    def centre: Point 
    def radius: Double 
} 

Có hai lớp con có thể, một trong những nơi vòng tròn được xác định trong điều khoản của một hộp bounding, và một trong những nơi nó được định nghĩa về trung tâm và bán kính. Nhờ có UAP, chi tiết về việc triển khai có thể hoàn toàn bị trừu tượng hóa và dễ dàng thay đổi.

Ngoài ra còn có khả năng thứ ba: lười biếng. Đây sẽ là rất hữu ích để tránh tính toán lại các giới hạn của vòng tròn của chúng tôi một lần nữa và một lần nữa, nhưng thật khó để tưởng tượng làm thế nào lười biếng vals có thể được thực hiện mà không có nguyên tắc truy cập thống nhất.