2012-06-17 28 views
29

thể trùng lặp:
Why use getters and setters?Advantage của bộ và nhận được phương pháp vs biến công

Có lợi thế để làm phương pháp để truy cập các biến riêng trong lớp học của bạn thay vì làm công chúng biến ?

Ví dụ: trường hợp thứ hai tốt hơn trường hợp đầu tiên?

//Case 1 
public class Shoe{ 
    public int size; 
} 

//Case 2 
public class Shoe{ 
    private int size; 
    public int getSize(){ 
     return size; 
    } 

    public void setSize(int sz){ 
     size = sz; 
    } 

} 
+0

bản sao có thể có của [Tại sao sử dụng getters và setters?] (Http://stackoverflow.com/questions/1568091/why-use-getters-and-setters) và [Getters và setters được triển khai tự động so với các trường công khai] (http://stackoverflow.com/questions/111461) –

Trả lời

59

Những gì tôi đã thấy một ngày nào đó trên SO, như câu trả lời (được viết bởi @ ChssPly76) tại sao sử dụng getter và setter

Bởi vì 2 tuần (tháng, năm) từ bây giờ khi bạn nhận ra rằng bạn setter cần phải làm nhiều hơn là chỉ cần thiết lập các giá trị, bạn cũng sẽ nhận ra rằng bất động sản đã được sử dụng trực tiếp trong 238 lớp khác :-)

có nhiều ưu điểm:

  1. getter và setter có thể có xác nhận trong đó, lĩnh vực không
  2. có thể sử dụng getter bạn có thể có được lớp con của lớp truy nã.
  3. getter và setter là đa hình, lĩnh vực không phải là
  4. gỡ lỗi có thể đơn giản hơn nhiều, bởi vì breakpoint có thể được đặt bên trong một phương pháp không gần nhiều tài liệu tham khảo về điều đó lĩnh vực nhất định.
  5. họ có thể hide thực hiện thay đổi:

trước:

private boolean alive = true; 

public boolean isAlive() { return alive; } 
public void setAlive(boolean alive) { this.alive = alive; } 

sau:

private int hp; // change! 

public boolean isAlive() { return hp > 0; } // old signature 
//method looks the same, no change in client code 
public void setAlive(boolean alive) { this.hp = alive ? 100 : 0; } 

EDIT: thêm một Advange mới khi bạn đang sử dụng Eclipse - bạn có thể tạo điểm quan sát trên trường, nhưng nếu bạn có setter bạn cần chỉ là điểm ngắt và ... điểm ngắt (ví dụ: trong phương thức setter) có thể có điều kiện, các điểm quan sát (trên thực địa) không thể. Vì vậy, nếu bạn muốn dừng trình gỡ lỗi của mình chỉ khi x=10 bạn có thể làm điều đó chỉ với điểm ngắt bên trong bộ đặt.

+0

getters và định vị các phần tốt (http://pawel-michalski-javnie.blogspot.de/2012) /04/gettery-settery-enkapsulacja-czy.html) không buồn cười chút nào ... tại sao lại cho nó một tựa đề tiếng Anh và tiếp tục với một số ngôn ngữ lạ ... –

+1

@MatthisKohli Xin lỗi, bạn nói đúng. Tôi đã xóa liên kết đó. – dantuch

4
  1. Một số thư viện yêu cầu điều này phải đáp ứng "tiêu chuẩn Java Bean".
  2. Một setter/getter có thể được trong một giao diện, một tài sản không thể có trong một giao diện
  3. Setters/getters có thể dễ dàng được ghi đè trong các lớp hạ xuống.
  4. setters/getters trừu tượng đi những thông tin cho dù một giá trị được tính toán theo yêu cầu hoặc chỉ là một accessor đến một tài sản
6

Sử dụng biến nào có thể gây ra thiết lập các giá trị sai cho biến như giá trị đầu vào không thể được kiểm tra .

ví dụ:

public class A{ 

    public int x; // Value can be directly assigned to x without checking. 

    } 

Sử dụng setter có thể được sử dụng để thiết lập các biến với kiểm tra đầu vào. Giữ dụ varibale tư nhân, và getter và công setter là một hình thức Encapsulation getter và setter cũng tương thích với Java Beans chuẩn,

getter và setter cũng giúp trong thực hiện đa hình khái niệm

ví dụ:

public class A{ 

    private int x;  // 


     public void setX(int x){ 

     if (x>0){      // Checking of Value 
     this.x = x; 
     } 

     else{ 

      System.out.println("Input invalid"); 

     } 
    } 

     public int getX(){ 

      return this.x; 
     } 

dụ đa hình: Chúng ta có thể assig n Biến tham chiếu đối tượng của kiểu phụ làm đối số từ phương thức gọi đến biến tham chiếu đối tượng của tham số siêu lớp của phương thức được gọi.

public class Animal{ 

     public void setSound(Animal a) { 

      if (a instanceof Dog) {   // Checking animal type 

       System.out.println("Bark"); 

      } 

     else if (a instanceof Cat) {  // Checking animal type 

       System.out.println("Meowww"); 

      } 
     } 
     } 
0

Hơi ngược lại khi nhìn vào mọi thứ.

Có trường hợp nào tốt hơn để phơi bày hoạt động bên trong lớp học của bạn thông qua việc biến thành viên thành công cộng, vì vậy bất kỳ người tiêu dùng nào cũng có thể làm những điều mà nhà thiết kế không bao giờ che giấu, dẫn đến thất bại và dồi dào sự cố?

Sắp xếp các câu trả lời cho chính mình thực sự là một câu trả lời đúng không?

Nguyên lý nền tảng của OO, đóng gói. Biến thành viên công khai về cơ bản là biến toàn cầu có tiền tố ...

+4

Có những lý do tốt để không sử dụng getters và setters - chúng làm lộn xộn mã, làm cho nó khó đọc hơn, và chúng vi phạm nguyên tắc DRY. Trong thực tế, trong các ngôn ngữ với các thuộc tính, nó phổ biến để chỉ làm cho mọi thứ công khai (vì nó có thể được tái cấu trúc thành các thuộc tính sau này nếu nó thực sự cần thiết). – Antimony

+0

@Antimony. Không phải là nơi cho một cuộc tranh luận, nhưng tôi không thể đồng ý, thậm chí không một chút. Tôi đã nhìn thấy quá nhiều trường hợp đã được sắp xếp 'erm phím tắt, đã gây ra cách làm việc nhiều hơn chỉ refactoring đến một tài sản. Nhiều hơn nhiều. –