2011-11-10 9 views
5

En nuestro proyecto necesitamos almacenar algún objeto (usuario, por ejemplo) y también la clase de usuario debe tener una bandera de validación (métodos como setOutdated y isOutdated)¿Qué patrón preferiría?

De vez en cuando, nuestro objeto de usuario puede ser nula, pero bandera de validación debe ser alcanzable en este caso. Es posible extraer esos métodos de la clase de Usuario, pero ese campo y los métodos deben estar dentro de esa clase debido a la semántica.

He encontrado algunos artículos sobre el patrón Objeto nulo (como this), y quiero saber: ¿es posible crear Objeto nulo (como un patrón) que puede almacenar varios estados como nulo obsoleto, nulo no desactualizado, no nulo obsoleto y no nulo no desactualizado.

PD: Si un campo de introducir "anticuado" en mi clase, que será muy difícil de objetos transparentes en lugar de establecer que en nulo

+0

¿Hay alguna razón en particular que no desea comprobar si se trata de un nulo antes de que realmente llama 'isOutdated()' o "damas del estado" similares? – DejanLekic

+0

Incluso si el usuario es nulo, que debe tener acceso al campo obsoleta, por lo que hay que almacenar en algún sitio que información – skayred

+0

En ese caso, simplemente añadiría un estado, por ejemplo "readyToUse", que se establece en false por defecto, y utilizar el objeto como que "no es nulo" solo cuando readyToUse es verdadero. – DejanLekic

Respuesta

2

se quiere diferenciar entre (entre otros) "nulo obsoleta" y "nulo no obsoleta".
Esto significa que usted sugiere dos diferentes objetos nulos, con un comportamiento diferente. Se trata de una violación del patrón que dice que un objeto nulo debe tener un tipo de comportamiento, el comportamiento predeterminado de un objeto no inicializado de su tipo.

que sugieren que o bien utiliza el @Kent solución proporcionada, o que haga su objeto de usuario algo así como objetos "FormerUser" "PresentUser" y. Esta última es técnicamente la misma solución que usted propone, pero no es un Patrón de Objeto Nulo.

2

Mi primera idea es la adición de una clase UserUtil (nombre podría ser otra cosa) .

y un método como

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

} 

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

funciona en su situación?

+0

Tengo miedo de usar métodos estáticos porque parece ser una mala práctica en OOP – skayred

+0

Creo que los métodos estáticos para una clase util están bien. Si realmente odias la estática, por supuesto puedes eliminar la 'estática' y crear un constructor apropiado. punto es, si esta solución en mi respuesta funciona en su situación? – Kent

Cuestiones relacionadas