2011-12-07 30 views

Trả lời

11

Trước tiên, bạn nên biết rằng khi bạn viết:

class Person(val name: String, val age: Int) { 
    ... 
} 

nameage không biến dụ nhưng accessors phương pháp (thu khí), mà là công khai theo mặc định.

Nếu bạn viết thay vì:

class Person(name: String, age: Int) { 
    ... 
} 

nameage chỉ biến Ví dụ, đó là riêng tư như bạn có thể mong đợi.

Triết lý của Scala là thích các biến mẫu bất biến, sau đó có các phương thức truy cập công khai không còn là vấn đề nữa.

+3

Trong ví dụ thứ hai của bạn, 'name' và' age' cũng có thể chỉ là tham số hàm tạo và không phải là biến mẫu, tùy thuộc vào cách chúng được sử dụng trong nội dung của 'Person'. –

+0

Có bạn nói đúng, tôi không muốn làm phức tạp câu trả lời. – paradigmatic

5

Riêng tư khuyến khích nguyên khối. Ngay sau khi nó dễ dàng hơn để đưa chức năng không liên quan vào một lớp chỉ vì nó cần phải đọc một số biến xảy ra là riêng tư, các lớp bắt đầu phát triển.

Nó chỉ là một mặc định xấu và là một trong những lý do chính cho các lớp học với hơn 1000 dòng trong Java.

Scala mặc định là không thay đổi, loại bỏ một số lượng lớn các lỗi mà mọi người thường sử dụng riêng để hạn chế (nhưng không loại bỏ, vì các phương thức riêng của lớp vẫn có thể biến đổi các biến) trong Java.

3
  1. với immutables được ưa thích ở nhiều nơi, công không phải là quá nhiều của một vấn đề
  2. bạn có thể thay thế một val công với getter và setter mà không thay đổi mã khách hàng, do đó bạn không cần thêm lớp getters và setters chỉ trong trường hợp bạn cần nó. (Trên thực tế bạn nhận được lớp đó nhưng bạn không nhận thấy nó hầu hết thời gian.)
  3. java chống mô hình của lĩnh vực tư nhân + setters công cộng và thu khí không đóng gói nhiều anyway
3

(Một thêm xem bổ sung các câu trả lời khác :)

Một trình điều khiển chính đằng sau việc đóng gói các trường của Java là chính sách truy cập thống nhất, tức là bạn không phải biết hoặc quan tâm liệu một cái gì đó đã được thực hiện đơn giản như một trường hay được tính bằng phương thức con ruồi. Sự lộn ngược lớn của việc này là người bảo trì của lớp đang nghi ngờ có thể chuyển đổi giữa hai người theo yêu cầu, mà không cần phải sửa đổi các lớp khác.

Trong Java, điều này yêu cầu mọi thứ được truy cập thông qua một phương pháp, để cung cấp tính linh hoạt cú pháp để tính toán giá trị nếu cần. Trong Scala, các phương thức và trường có thể được truy cập thông qua cú pháp tương đương - vì vậy nếu bạn có một thuộc tính đơn giản ngay bây giờ, sẽ không mất gói gọn để hiển thị trực tiếp, vì bạn có thể chọn nó như một phương thức no-arg sau này. mà không có người gọi của bạn cần phải biết bất cứ điều gì về sự thay đổi.

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