2009-06-09 40 views
5

Tôi đang tìm một cách sạch sẽ và an toàn để đảm bảo một trường của một lớp sẽ không bao giờ được đặt thành rỗng. Tôi muốn giá trị trường được đặt một lần trong hàm tạo lớp và không bao giờ được sửa đổi sau này. Tôi nghĩ rằng ông chỉ đọc từ khóa trong C# cho phép điều này. Có cách nào để làm tương tự trong Java?Làm thế nào để đảm bảo rằng một trường sẽ không bao giờ rỗng trong một lớp Java

class foo 
{ 

    private Object bar; 

    public foo(Object pBar) 
    { 
    if(pBar == null) 
    { 
     bar = new Object(); 
    } 
    else 
    { 
     bar = pBar 
    } 
    } 

    // I DO NOT WANT ANYONE TO MODIFY THE VALUE OF bar OUT OF THE CONSTRUCTOR 

} 

Trả lời

16

Khai barfinal, như thế này:

private final Object bar; 
7

Bạn đang tìm kiếm trận chung kết từ khóa.

class foo 
{ 
    private final Object bar; 

    public foo(Object pBar) 
    { 
     //Error check so that pBar is not null 
     //If it's not, set bar to pBar 
     bar = pBar; 
    } 
} 

Bây giờ thanh không thể thay đổi

6

Cả hai câu trả lời trước đó là chính xác, nhưng pBar vẫn có thể được thiết lập để null:

new foo(null); 

Vì vậy, câu trả lời cuối cùng là sử dụng chính thức từ khóa và đảm bảo pBar không phải là rỗng (như trước đây):

public class Foo 
{ 
    private final Object bar; 

    public Foo(Object pBar) 
    { 
     if (pBar == null) 
     { 
      bar = new Object(); 
     }else{ 
      bar = pBar; 
     } 
    } 
} 
+1

+1, nhưng tôi nghĩ tốt hơn là nên ném ngoại lệ hoặc sử dụng khẳng định thay vì âm thầm gán một đối tượng mới(). –

1

Bạn muốn khai báo trường này là cuối cùng, ví dụ .

private final Object foo; 

Điều này mang lại lợi ích bổ sung cho điều đó. đồng thời trường được đảm bảo được khởi tạo sau khi hàm tạo đã kết thúc.

Lưu ý rằng điều này chỉ ngăn thay thế đối tượng bằng cách khác. Nó không ngăn thay đổi đối tượng bằng các phương pháp của đối tượng, ví dụ: setters, không giống như const trong C/C++.

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