2010-02-01 12 views
16

Me acabo de dar cuenta de que JDK 6 tiene un enfoque diferente para establecer un TimeZone predeterminado que JDK5.TimeZone.setDefault cambios en JDK6

Anteriormente, el nuevo valor predeterminado se almacenaba en una variable local de subprocesos. Con JDK6 (acabo de revisar 1.6.0.18) la implementación ha cambiado, de modo que si el usuario puede escribir en la propiedad "user.timezone", o si no hay SecurityManager instalado, ¡la zona horaria cambia a toda la VM! De lo contrario, se produce un cambio local de subprocesos.

¿Estoy equivocado? Esto parece ser un cambio bastante drástico, y no pude encontrar nada en la web al respecto.

Este es el código JDK6:

private static boolean hasPermission() { 
    boolean hasPermission = true; 
    SecurityManager sm = System.getSecurityManager(); 
    if (sm != null) { 
    try { 
    sm.checkPermission(new PropertyPermission("user.timezone", "write")); 
    } catch (SecurityException e) { 
    hasPermission = false; 
    } 
    } 
    return hasPermission; 
} 

/** 
    * Sets the <code>TimeZone</code> that is 
    * returned by the <code>getDefault</code> method. If <code>zone</code> 
    * is null, reset the default to the value it had originally when the 
    * VM first started. 
    * @param zone the new default time zone 
    * @see #getDefault 
    */ 
public static void setDefault(TimeZone zone) 
{ 
    if (hasPermission()) { 
    synchronized (TimeZone.class) { 
    defaultTimeZone = zone; 
    defaultZoneTL.set(null); 
    } 
    } else { 
    defaultZoneTL.set(zone); 
    } 
} 

tiempo antes (en JDK5) era simplemente:

/** 
    * Sets the <code>TimeZone</code> that is 
    * returned by the <code>getDefault</code> method. If <code>zone</code> 
    * is null, reset the default to the value it had originally when the 
    * VM first started. 
    * @param zone the new default time zone 
    * @see #getDefault 
    */ 
public static synchronized void setDefault(TimeZone zone) 
{ 
    defaultZoneTL.set(zone); 
} 

Respuesta

4

Probablemente, esto se hace para corregir un error. Buscaría bugs.sun.com para encontrar la razón de ser. (Las pistas también podrían encontrarse en el release notes.)

1

La documentación de la API para TimeZone.getDefault() afirma que "la fuente de la zona horaria por defecto puede variar con la aplicación." Si su código depende del comportamiento específico de implementación de las clases de API estándar (en este caso, que la zona horaria predeterminada se mantiene en un nivel local de subproceso), debe esperar que su código falle con versiones más recientes de la VM o con VM de diferentes vendedores.

Cuestiones relacionadas