Los DateFormats no son seguros para subprocesos, lo que significa que mantienen una representación interna del estado. Usarlos en un contexto estático puede producir algunos errores bastante extraños si varios hilos acceden a la misma instancia simultáneamente.
Mi sugerencia sería hacer que sus variables locales a donde las está utilizando en lugar de convertirlas en propiedades estáticas de la clase. Parece que podría estar haciendo esto cuando se está inicializando la clase, por lo que podría hacer esto en el constructor:
public class MyClass {
private String fileName;
public MyClass() {
final Date today = Calendar.getInstance().getTime();
final DateFormat yymmdd = new SimpleDateFormat("yyMMdd");
this.fileName = "file_" + yymmdd.format(TODAY);
}
...
}
Y si es necesario utilizar el formateador en múltiples lugares, que sólo podría hacer que el patrón static final
y crear un nuevo DateFormat
local cuando sea necesario:
public class MyClass {
private static final String FILENAME_DATE_PATTERN = "yyMMdd";
public void myMethod() {
final DateFormat format = new SimpleDateFormat(FILENAME_DATE_PATTERN);
// do some formatting
}
}
el FindBugs documentation para el tema dice:
Como los estados JavaDoc, DateFormats son intrínsecamente inseguro para uso multiproceso . El detector ha encontrado una llamada al se ha obtenido una instancia de DateFormat que tiene a través de un campo estático. Esta parece sospechosa.
Para obtener más información al respecto, vea Sun Error # 6231579 y Error de sol # 6178997.
Y el javadoc for DateFormat sugiere:
formatos de fecha no están sincronizadas. Se recomienda para crear instancias de formato separadas para cada subproceso. Si varios subprocesos acceden a un formato al mismo tiempo, se debe sincronizar externamente.
Jack Leow's answer también tiene un buen punto acerca de la semántica de su uso estático de "TODAY".
De hecho, he visto esto suceder en un entorno de producción de alto tráfico, y es una cosa muy confusa para depurar al principio; entonces, en mi experiencia, la advertencia FindBugs es en realidad una sugerencia útil (a diferencia de algunas otras reglas de análisis estático, que a veces parecen ser insignificantes).
Aparte del método de llamada, este código se ve un poco sospechoso - 'TODAY' será un día constante, ¿el formateador es un final no estático? – Pool
También HOY no siempre puede ser "hoy", si, por ejemplo, se carga esta clase y luego se deja ejecutar la JVM hasta el día siguiente; cualquier lógica que dependa de HOY para ser el día actual no funcionará, a menos que esté contabilizando esta discrepancia – Peter
@ Peter: Sí, el programa se restablece para cada ejecución. – Joset