2011-11-10 26 views
5

Trong dự án của chúng tôi, chúng tôi cần lưu trữ một số đối tượng (Ví dụ: Người dùng) và cũng là Lớp người dùng phải có cờ xác thực (các phương pháp như setOutdated và isOutdated)Tôi thích mẫu nào hơn?

Thỉnh thoảng, đối tượng người dùng của chúng tôi có thể rỗng, nhưng cờ xác thực phải có thể truy cập được trong trường hợp này. Có thể trích xuất các phương thức đó từ lớp User, nhưng trường và phương thức đó phải nằm trong lớp đó vì ngữ nghĩa.

Tôi đã tìm thấy một số bài viết về mẫu đối tượng Null (như this), và tôi muốn biết - có thể tạo đối tượng Null (làm mẫu) có thể lưu trữ một số trạng thái như không lỗi thời, null không lỗi thời, không null lỗi thời và không null không lỗi thời.

PS: Nếu một giới thiệu trường "lỗi thời" trong lớp học của tôi, nó sẽ thực sự khó khăn cho đối tượng rõ ràng thay vì thiết lập nó để null

+0

Có lý do cụ thể nào mà bạn không muốn kiểm tra xem đó có phải là null trước khi bạn thực sự gọi là "kiểm tra trạng thái" isOutdated() 'hoặc tương tự" không? – DejanLekic

+0

Thậm chí nếu người dùng là null, tôi phải có quyền truy cập vào trường lỗi thời, vì vậy tôi phải lưu trữ ở đâu đó thông tin – skayred

+0

Trong trường hợp đó, tôi chỉ cần thêm trạng thái, nói "readyToUse" được đặt thành false theo mặc định và sử dụng đối tượng giống như nó là "không phải là vô giá trị" chỉ khi readyToUse là đúng. – DejanLekic

Trả lời

2

Bạn muốn phân biệt giữa (trong số những thứ khác) "null lỗi thời" và "null không lỗi thời".
Điều này có nghĩa là bạn đề xuất hai các đối tượng Null khác nhau, với hành vi khác nhau. Đây là một sự vi phạm các mô hình mà nói rằng một đối tượng Null nên có một loại hành vi, hành vi mặc định cho một đối tượng uninitialized của nó loại.

Tôi đề nghị bạn sử dụng giải pháp @Kent được cung cấp hoặc bạn đặt đối tượng người dùng của mình giống như đối tượng "Người dùng hiện tại" và "Người dùng cũ". Sau này về mặt kỹ thuật là giải pháp tương tự mà bạn tự đề xuất, nhưng nó không phải là một Mẫu đối tượng Null.

2

ý tưởng đầu tiên của tôi là thêm một lớp UserUtil (tên có thể là cái gì khác) .

và một phương pháp như

public static boolean isUserOutdated(User u){ 
return (u==null)? true :u.isOutdated(); 

} 

or return (u==null)? false :u.isOutdated(); depends on your businesslogic 

nào nó hoạt động trong tình huống của bạn?

+0

Tôi sợ sử dụng các phương pháp tĩnh vì nó có vẻ là một thực hành xấu trong OOP – skayred

+0

tôi cảm thấy các phương pháp tĩnh cho một lớp util là ok. Nếu bạn thực sự ghét tĩnh, bạn có thể loại bỏ các 'tĩnh' và tạo ra một nhà xây dựng thích hợp. điểm là, nếu giải pháp này trong câu trả lời của tôi hoạt động trong tình huống của bạn? – Kent

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