2011-11-10 2 views
5

우리는 어떤 객체 (예 : User)를 저장해야하며 User 클래스는 유효성 검사 플래그 (setOutdated 및 isOutdated와 같은 메소드)가 있어야합니다.내가 선호하는 패턴은 무엇입니까?

가끔씩 User 객체가 null 일 수 있지만 이 경우 유효성 검사 플래그에 도달 할 수 있어야합니다. User 클래스에서 이러한 메서드를 추출 할 수 있지만 해당 필드와 메서드는 의미로 인해 해당 클래스 내에 있어야합니다.

null 개체 패턴 (예 : this)에 대한 기사를 찾았습니다. 오래된 것과 같은 여러 상태를 저장할 수있는 널 개체 (패턴)를 만들 수 있습니까? 오래된 것은 아닙니다. 오래된 것이 아니고 오래된 것도 아닙니다.

PS : 내 수업에 소개 "오래된"필드, 대신

+0

'isOutdated()'또는 이와 유사한 "상태 검사기"를 실제로 호출하기 전에 null인지 확인하고 싶지 않은 특별한 이유가 있습니까? – DejanLekic

+0

User가 null 인 경우에도 오래된 필드에 액세스해야하므로 정보를 저장해야합니다. – skayred

+0

이 경우 단순히 상태를 추가하고 기본적으로 false로 설정된 "readyToUse"라고 말하면됩니다. readyToUse가 true 인 경우에만 "null이 아닙니다"와 같습니다. – DejanLekic

답변

2

당신은 (특히) "오래된 것"과 "오래된 것이 아닙니다"를 구별하고 싶습니다.
다른 동작을 사용하여 두 개의 다른 Null 개체를 제안했습니다. 이는 Null 객체가 한 종류의 동작을 가져야한다는 패턴의 위반입니다. 즉, 초기화되지 않은 객체의 기본 비헤이비어입니다.

제공된 @ Kent 솔루션을 사용하거나 사용자 개체를 "PresentUser"및 "FormerUser"개체로 만들 것을 제안합니다. 후자는 기술적으로 사용자가 제안하는 것과 동일한 솔루션이지만 Null Object Pattern이 아닙니다.

2

내 첫번째 생각은 UserUtil 클래스를 추가를 null로 설정하는 정말 열심히 명확 객체가 될 경우 (이름은 뭔가 다른 수) .

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

} 

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

같은 방법은 당신의 상황에서 작동합니까?

+0

정적 메서드를 사용하는 것이 두렵습니다. OOP에서 나쁜 습관 인 것 같습니다. – skayred

+0

util 클래스의 정적 메서드가 좋다고 생각합니다. 당신이 정말로 정적 인 것을 싫어한다면 물론 '정적 인'것을 제거하고 적절한 생성자를 생성 할 수 있습니다. 요점은, 만약 당신의 상황에서이 해답이 작동한다면? – Kent

관련 문제