2011-12-14 23 views
15

Tôi thường thấy các nhà thầu như thế nàySử dụng các phương thức setter trong hàm khởi tạo: thực hành xấu?

public class A { 

    private int b; 

    public A(int b) { 
     setB(b); 
    } 

    public void setB(int b) { 
     this.b = b; 
    } 
} 

Đây có phải là một ý tưởng hay không? Tôi có nên sử dụng phương pháp setter trong constructor? Nó không phải là một vấn đề nếu tôi sẽ ghi đè lên một trong hai nhà xây dựng hoặc các phương pháp setter trong một lớp phụ?

+0

constructor chỉ sử dụng cho khởi biến. nó không phải là một ý tưởng tốt để gọi bất kỳ phương pháp thông qua constructor. – Ashish

Trả lời

28

Có thể là không phải là một ý tưởng hay. Nếu bạn không làm cho rằng lớp cuối cùng và không làm cho setName (...) phương pháp tư nhân hoặc cuối cùng một người nào khác có thể mở rộng lớp học của bạn và overrid phương thức setName (...). Constructor của bạn (trong lớp cơ sở của bạn) sẽ gọi phương thức đó trong lớp mở rộng thay vì thực hiện của bạn. Không ai biết phương pháp đó có thể làm gì. Như một quy tắc của ngón tay cái: một nhà xây dựng không nên gọi các phương pháp có thể được overriden.

+7

Không chỉ vậy: trong lệnh gọi 'setName()', hàm tạo lớp con chưa được gọi, vì vậy các biến cuối cùng có thể chưa được khởi tạo, v.v. – artbristol

2

Tôi nghĩ bạn nên chọn cẩn thận và nhận thức được nhược điểm của từng loại.

Nếu lớp học bạn đang xác định có khả năng được phân loại phụ, hãy đặc biệt cẩn thận để tránh bị uninitialised tại thời điểm lớp con cần bạn hoàn thành.

Đây có thể là một cơ chế hữu ích nhưng theo tôi, thật khó chịu.

public class A { 

    private int b; 

    public A(int b) { 
     _setB(b); 
    } 

    private void _setB(int b) { 
     this.b = b; 
    } 

    public void setB(int b) { 
     _setB(b); 
    } 
} 

Cá nhân tôi muốn rằng một cái gì đó giống như mặc dù điều này:

public class A { 

    private int b; 

    public A(int b) { 
     this.b = b; 
    } 

    public void setB(int b) { 
     this.b = b; 
    } 
} 
+0

Nhưng, nếu bạn phải kiểm tra tham số [b] trước khi sử dụng nó, bạn có thể có một mã dự phòng !! –

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