2011-12-07 34 views
7

Câu hỏi này có sự nhấn mạnh nhỏ về Java nhưng áp dụng cho bất kỳ ngôn ngữ OO nào. Có thực hành tốt để khởi tạo biến lớp trong khai báo của chúng không? Nó có vẻ rõ ràng như vậy với tôi. Nó giảm thiểu nguy cơ sai lầm ngoại lệ con trỏ null ngớ ngẩn.Thực tiễn tốt nhất để khởi tạo thuộc tính đối tượng trong Ngôn ngữ OO

Ví dụ:

class myClass{ 

    private String name = "";// initialize here 

    public myClass(){ 

    //something 

    } 
} 

Nhưng trong một số sách giáo khoa họ không bận tâm để khởi tạo ngay lập tức. Cái nào tốt hơn? Nó có quan trọng không?

+0

Đó không phải là biến lớp, đó là biến mẫu. –

+3

NPE tệ hơn giá trị được khởi tạo như thế nào, nhưng với giá trị không chính xác hoặc không hợp lệ? –

+0

Đánh dấu là chính xác. Một NullPointerException là tốt hơn so với việc nó không âm thầm với một giá trị không chính xác. –

Trả lời

5

Một trường hợp tốt hơn là không khởi tạo nội tuyến là nơi bạn có nhiều hàm tạo khởi tạo các trường theo các cách khác nhau. Sẽ không hiệu quả khi khởi tạo trường của bạn tại khai báo và sau đó thay thế giá trị đó bằng một giá trị được truyền cho một hàm tạo cụ thể sau này.

3

Điều này đã xuất hiện nhiều lần trên SO, vì vậy bạn nên tìm kiếm trang web để có thêm ý kiến.

Đề nghị của tôi cho Java (điều này chỉ có ý nghĩa trong một số ngôn ngữ):

Nếu giá trị ban đầu là cố định cho lớp, sau đó khởi inline.

Nếu các nhà thầu khác nhau đặt các giá trị ban đầu khác nhau, hãy gán các giá trị trong hàm tạo tương ứng.

Trong C++ 11 tình huống có phần tương tự.

0

Nó hoàn toàn phụ thuộc vào cách lớp được dự định sẽ được sử dụng.

Một ví dụ cho các lớp giá trị mà bạn thường có thể muốn không thay đổi. Lý tưởng nhất trong trường hợp này, bạn sẽ thiết lập các giá trị trong hàm tạo.

public final class Foo { 
    private final String foo; 
    public Foo(String foo) { 
     this.foo = foo; 
    } 
} 

Nếu có giá trị mặc định hợp lý thì bạn có thể cung cấp những giá trị này tại thời điểm khai báo. Nó có xu hướng làm cho nó khá dễ dàng để xem giá trị mặc định là gì. Tất nhiên, điều đó không hoạt động với các trường cuối cùng (như trên), vì không thể gán một giá trị khác.

Một xem xét khác là có liên quan đến các giá trị tương đối của hàm khởi tạo hoặc trình khởi tạo biến thể. Sử dụng khởi tạo constructor đảm bảo rằng cá thể không bao giờ ở trạng thái không nhất quán, trong khi khởi tạo mutator thường linh hoạt hơn và cung cấp một API dễ dàng hơn.

Trong nhận xét ban đầu về việc tránh NPE s, tôi muốn nói điều đó được giải quyết tốt nhất bằng cách sử dụng khởi tạo hàm tạo, dọc theo các dòng mã bên trên.

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