Bạn không bỏ sót bất cứ điều gì. Những gì bạn làm phụ thuộc hoàn toàn vào hoàn cảnh của bạn. Tuy nhiên, hãy xem xét điều này:
Việc xác thực thông số trong trình thiết lập là rất phổ biến.Ví dụ, giả sử tôi có một lớp học với lĩnh vực có thể chứa một giá trị từ 0 đến 10 (các "ném" là không cần thiết cho các ngoại lệ gõ bên dưới nhưng tôi bao gồm nó cho rõ ràng):
public class Example {
private int value;
public Example() {
}
public final int getValue() {
return value;
}
public final void setValue (int value) throws IllegalArgumentException {
if (value < 0 || value > 10)
throw new IllegalArgumentException("Value is out of range.");
}
}
Ở đây, setValue () xác nhận 'giá trị' để đảm bảo giá trị đó tuân thủ các quy tắc. Chúng tôi có một bất biến cho biết "một ví dụ sẽ không tồn tại với một giá trị ngoài phạm vi". Bây giờ chúng ta hãy nói rằng chúng ta muốn tạo một hàm tạo có giá trị. Bạn có thể làm điều này:
public class Example {
...
public Example (int value) {
this.value = value;
}
...
}
Như bạn thấy, có sự cố. Ví dụ mới (11) sẽ thành công, và bây giờ một ví dụ tồn tại phá vỡ các quy tắc của chúng ta. Tuy nhiên, nếu chúng ta sử dụng setter trong các nhà xây dựng, chúng ta có thể thuận tiện thêm tất cả các xác nhận tham số để các nhà xây dựng cũng như:
public class Example {
...
public Example (int value) throws IllegalArgumentException {
setValue(value); // throws if out of range
}
...
}
Vì vậy, có rất nhiều lợi ích này.
Bây giờ, vẫn có những trường hợp bạn có thể muốn chỉ định giá trị trực tiếp. Đối với một, có thể bạn không có setters (mặc dù tôi cho rằng việc tạo private hoặc package setters riêng vẫn là điều mong muốn, vì những lý do đã đề cập ở trên, để hỗ trợ phản ánh/bean nếu cần thiết và dễ dàng xác nhận trong mã phức tạp hơn).
Một lý do khác có thể là bạn có một nhà xây dựng biết, bằng cách nào đó, trước thời hạn giá trị hợp lệ sẽ được chỉ định và do đó không cần xác thực và có thể gán biến trực tiếp. Điều này thường không phải là một lý do thuyết phục để bỏ qua bằng cách sử dụng setters mặc dù. Tuy nhiên, tất cả-trong-tất cả, nó thường là một ý tưởng tốt để sử dụng các setters ở khắp mọi nơi khi có thể, nó thường sẽ dẫn đến sạch hơn và rõ ràng hơn code đó là dễ dàng hơn để duy trì như tăng phức tạp. Các tính năng:.
Hầu hết các ví dụ bạn thấy nơi mọi người đặt biến trực tiếp chỉ là người "lười" - hoàn toàn có thể chấp nhận được nếu tình huống đảm bảo (có thể bạn đang viết chương trình hoặc ứng dụng thử nghiệm nhanh và không muốn thực hiện một loạt các setters, ví dụ). Không có gì sai với điều đó miễn là bạn giữ cho hình ảnh lớn trong tâm trí và chỉ được "lười biếng" khi nó thích hợp. Một điều tôi muốn thêm dựa trên một số câu trả lời khác ở đây: Nếu bạn ghi đè lên một setter trong một phân lớp, và dữ liệu bạn đang thiết lập phá vỡ bất biến mà lớp cơ sở thừa nhận, sau đó hoặc các setters có liên quan nên được thực hiện cuối cùng hoặc lớp cơ sở không nên đưa ra những giả định đó. Nếu các bộ định vị ghi đè phá vỡ các biến thể lớp cơ sở thì có một vấn đề lớn hơn trong tầm tay.
Bạn sẽ nhận thấy trình gỡ rối/bộ đặt là cuối cùng trong ví dụ trên. Điều này là do quy tắc của chúng tôi là "bất kỳ Ví dụ nào phải có giá trị từ 0 đến 10". Quy tắc này do đó mở rộng đến các lớp con. Nếu chúng ta không có quy tắc đó và nếu một ví dụ có thể lấy bất kỳ giá trị nào, thì chúng ta sẽ không cần một setter cuối cùng và có thể cho phép các lớp con ghi đè.
Hy vọng điều đó sẽ hữu ích.
Tôi tin rằng mục đích của việc biến các biến là riêng biệt là cô lập chúng khỏi thao tác trực tiếp từ ** các lớp ** khác. –
ngoài ra, từ khóa 'this' này không bắt buộc đối với getter; nó chỉ được sử dụng khi có sự mơ hồ (nghĩa là nếu có một biến khác gọi là "tên" trong cùng phạm vi) – ataulm