2012-01-24 3 views
18

Tôi thấy một mã nơi các phương thức getters và setters được khai báo riêng. Tôi đang cố gắng tìm ra logic đằng sau nó, và tôi thực sự có thời gian khó khăn để hiểu tại sao bạn lại tuyên bố chúng là riêng tư? Điều đó hoàn toàn trái ngược với những gì chúng ta đang cố gắng đạt được thông qua các getters và setters.Tại sao bạn khai báo phương thức getters và setters riêng tư?

Trả lời

11

tôi có thể nghĩ ra nhiều lý do:

  • bạn muốn ngăn chặn truy cập công cộng trong tương lai.

Nếu một lập trình viên khác nhìn thấy mã của bạn và muốn truy cập vào biến, nhưng không có người định cư và getters, anh ấy có thể nghĩ bạn vừa quên chúng và tự thêm chúng. Tuy nhiên, nếu bạn tuyên bố chúng là private, đó là tuyên bố về mục đích, nói rằng Tôi không muốn các biến này được thay đổi hoặc truy cập từ bên ngoài.

  • bạn muốn kết hợp thiết lập và nhận được với những hành động khác

Giả sử bạn không muốn public accessors. Nhưng có thể bạn muốn đếm số lần biến cá nhân được thay đổi. Việc sử dụng setter dễ dàng hơn là tăng số đếm mỗi lần bạn truy cập biến đó.

  • bạn muốn có một điểm truy cập trung tâm

Một lần nữa, bạn không muốn public truy cập, nhưng trong quá trình gỡ lỗi, bạn có thể muốn đặt một breakpoint ở mọi nơi một thành viên private được thay đổi. Vì vậy, thay vì thiết lập các điểm ngắt ở khắp mọi nơi trong lớp, bạn chỉ cần đặt một điểm trong accessor.

8

Điều đó hoàn toàn trái ngược với những gì chúng tôi đang cố gắng đạt được thông qua getters và setters.

Thực ra, không phải. Lý do để khai báo getters và setters là ẩn các trường. Điều này được thực hiện để tránh khớp nối không mong muốn; tức là khách hàng của API tùy thuộc vào chi tiết triển khai của API. (Khớp nối Đó có thể là vấn đề đối với một số lý do.)

Lý do khiến các getter và setter tin là làm cho phần tương ứng của nhà nước trừu tượng của đối tượng tư nhân. Đó là phần lớn độc lập của quyết định sử dụng getters và setters hay không.

Trong trường hợp sử dụng getters và setters không phải là mạnh cho nhà nước tư nhân, vẫn còn lợi ích hữu hình. Ví dụ:

  • Phương thức getter/setter cung cấp chỗ để thêm hành vi bổ sung hoặc mã kiểm tra lỗi.

  • Chúng cũng cung cấp một nơi để thêm mã gỡ lỗi hoặc mã kiểm tra tiêm (để kiểm tra đơn vị).

  • Getters and setters có thể bị ghi đè. Bạn không thể làm điều đó với các trường (riêng tư hay không).