2009-03-10 29 views
18

Nếu bạn có một lớp với một số thuộc tính get/set đơn giản, có lý do nào để sử dụng getters trong các phương thức lớp hay bạn chỉ sử dụng biến thành viên riêng? Tôi nghĩ rằng có thể có nhiều tranh cãi hơn về những người định cư (logic xác nhận?), Nhưng tôi tự hỏi chỉ là về getters.Sử dụng getters trong các phương thức lớp

Ví dụ (trong Java) - là có lý do nào để sử dụng tùy chọn 2 ?:

public class Something 
{ 
    private int messageId; 
    public int getMessageId() { return this.messageId; } 
    public void setMessage(int messageId) { this.messageId = messageId; } 

    public void doSomething() 
    { 
     // Option 1: 
     doSomethingWithMessageId(messageId); 

     // Option 2: 
     doSomethingWithMessageId(getMessageId()); 
    } 
} 
+0

bản sao có thể có của [Khi nào một lớp nên sử dụng getters/setters của riêng mình khi truy cập trực tiếp vào thành viên?] (Http://stackoverflow.com/questions/586087/when-should-a-class-use-its-own -getters-setters-vs-access-the-members-directl) – nawfal

Trả lời

9

Các lập trình viên Java nói chung có xu hướng rất nhất quán về việc sử dụng các phương thức getter. Tôi chương trình đa ngôn ngữ và tôi không phải là nhất quán về nó;)

Tôi muốn nói miễn là bạn không làm cho một getter nó ok để sử dụng biến nguyên - cho biến tư nhân. Khi bạn thực hiện một getter, bạn chỉ nên sử dụng nó. Khi tôi làm cho một getter cho một lĩnh vực tư nhân, IDE của tôi cho thấy rằng nó thay thế truy cập trường thô cho tôi tự động khi tôi giới thiệu một getter. Việc chuyển sang sử dụng trình khởi động chỉ là một vài lần nhấn phím (và không có bất kỳ khả năng giới thiệu lỗi nào), vì vậy tôi có xu hướng trì hoãn nó cho đến khi tôi cần.

Tất nhiên, nếu bạn muốn các công cụ như getter-injection, một số loại proxy và subclassing framworks như hibernate, bạn phải sử dụng getters!

+1

IDE của bạn là gì? –

+0

Có bất kỳ khác biệt nào về hiệu suất JRE khi sử dụng getters không? – Khozzy

7

Với getters bạn wont vô tình sửa đổi các biến :) Ngoài ra, nếu bạn sử dụng cả getters và "thô" biến, mã của bạn có thể bị nhầm lẫn.

Ngoài ra, nếu bạn sử dụng kế thừa và định nghĩa lại các phương thức getter trong các lớp con, các phương thức getter-using sẽ hoạt động đúng, trong khi các phương thức sử dụng các biến thô thì không.

3

Nếu bạn sử dụng phương thức getter ở khắp mọi nơi - và trong tương lai thực hiện tìm kiếm mã trên tất cả các cuộc gọi getMessageId(), bạn sẽ tìm thấy tất cả chúng, trong khi nếu bạn đã sử dụng phương thức riêng, bạn có thể bỏ lỡ một số.

Ngoài ra nếu có bao giờ logic được giới thiệu trong phương pháp setter, bạn sẽ không phải lo lắng về việc thay đổi nhiều hơn 1 vị trí cho nó.

1

Nếu giá trị bạn chỉ định cho thuộc tính là giá trị đã biết hoặc được xác minh, bạn có thể sử dụng biến riêng tư một cách an toàn một cách trực tiếp. (Ngoại trừ có lẽ trong một số tình huống đặc biệt, nơi mà nó sẽ được rõ ràng lý do tại sao đó sẽ là xấu.) Cho dù bạn làm hay không là nhiều hơn một vấn đề của hương vị hoặc phong cách. Nó không phải là một vấn đề hiệu suất, hoặc là getter hoặc setter sẽ được biên dịch bởi trình biên dịch nếu nó đủ đơn giản.

Nếu không biết giá trị của lớp, bạn nên sử dụng thuộc tính để đặt, để bạn có thể bảo vệ thuộc tính khỏi các giá trị bất hợp pháp.

Dưới đây là một ví dụ (trong C#):

public class Something { 

    private string _value; 

    public string Value { 
     get { 
     return _value; 
     } 
     set { 
     if (value == null) throw new ArgumentNullException(); 
     _value = value; 
     } 
    } 

    public Something() { 
     // using a known value 
     _value = "undefined"; 
    } 

    public Something(string initValue) { 
     // using an unknown value 
     Value = initValue; 
    } 

} 
0

Nếu bạn sử dụng getter bạn đang đảm bảo bạn sẽ nhận được giá trị sau khi bất kỳ logic/quyết định đã được áp dụng cho nó. Đây có lẽ không phải là tình huống điển hình của bạn nhưng khi đó, bạn sẽ cảm ơn bản thân vì điều này.

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