2011-10-28 3 views
11

Esto es más de una continuación de las preguntas 1 & 2.Problemas de Findbugs con la mutabilidad del objeto Date en Java

como se cuenta en las preguntas que el código de abajo

public Date getSomeDate() { 
    return someDate; 
} 

le dará el error findbug issue.

La solución propuesta fue la de duplicar el objeto Date en ambos captadores y definidores como

public Date getSomeDate() { 
    return new Date(someDate.getTime()); 
} 

Es esta una buena aproximación o ¿existen formas alternativas a esto?

¿Hay alguna biblioteca de fecha inmutable disponible en java que pueda solucionar este problema?

+0

usted se refiere a derecha inmutable? de todos modos, el enfoque declarado es perfecto. –

+0

@PrinceJohnWesley: gracias y sí. He actualizado la Qs. ¿Quiere decir que está bien usar el constructor de Fecha en todos los getters y setter? – ManuPK

+0

Siempre que no exponga las llamadas a la biblioteca externa. no necesita clonar profundamente (constructor) porque sabe lo que hace. De lo contrario, siempre proporcione la referencia de diferencia si es mutable. Pruebe joda time api –

Respuesta

6

JodaTime tiene fechas inmutables.

Claro, está bien usar un constructor Date en un getter, ¿por qué no sería?

Dicho esto, el hecho de que FindBugs establezca el estado mutable como un error potencial, no significa que sea intrínsecamente valioso preocuparse por –, depende de cómo se use la clase. La inmutabilidad elimina un tipo de error, que puede o no necesitar preocuparse mucho.

0

Dependiendo de su caso de uso, puede devolver someDate.getTime() sin envolverlo en un Date.

0

Espera un momento ... copiando el objeto dentro de los métodos getSomeDate y setSomeDate no estamos eliminando el riesgo de seguridad ya que el objeto modificado regresa a través de la setSomeDate y copias a preservar los valores modificados. Sería necesario eliminar setSomeDate para resolver este tipo de problema de seguridad, o no se preocupe en absoluto.

+2

Al devolver una copia del objeto, evitamos que se comparta la representación interna: ayudará a evitar situaciones en las que el código de llamada (incluso si recibe esta propiedad en una variable local) manipula esto, la propiedad del bean será cambiado Para establecer lo obvio, setsomeDate no se puede eliminar ya que ese es el comportamiento fundamental del frijol. – emeralddove

7

Atención gente ...

además de adaptar tanto el comprador y el colocador es necesario tener cuidado acerca de los valores nulos:

public Date getSomeDate() { 
    if (this.someDate == null) { 
    return null; 
    } 
    return new Date(this.someDate.getTime()); 
} 

public void setSomeDate(final Date someDate) { 
    if (someDate == null) { 
    this.someDate = null; 
    } else{ 
    this.someDate = new Date(someDate.getTime()); 
    } 
} 
Cuestiones relacionadas