2010-02-01 4 views
16

Я только заметил, что JDK 6 имеет другой подход к установке TimeZone по умолчанию, чем JDK5.Изменения в TimeZone.setDefault в JDK6

Раньше новое значение по умолчанию хранилось в локальной переменной потока. С JDK6 (я только что рассмотрел 1.6.0.18) реализация изменилась, так что, если пользователь может записать свойство «user.timezone» или если нет установленного SecurityManager, часовой пояс изменится на всю VM! В противном случае происходит локальное изменение потока.

Я не прав? Это, кажется, довольно радикальное изменение, и я не мог найти что-либо в Интернете об этом.

Вот код 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); 
    } 
} 

в то время как раньше (в JDK5) это было просто:

/** 
    * 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); 
} 

ответ

12

Поиск в базе данных багов было на самом деле очень хорошая идея :)

http://bugs.sun.com/view_bug.do?bug_id=6352812

, а также (вос документы):

http://bugs.sun.com/view_bug.do?bug_id=6181786

Резюме: JDK 1.5 было исключение к правило, с JDK 1.6, все возвращается к «нормальному», что, согласно документам, заключается в том, что изменение часового пояса является широким.

4

Вероятно, это было сделано, чтобы исправить ошибку. Я бы поискал bugs.sun.com, чтобы найти для этого обоснование. (Улики также могут быть найдены в release notes.)

1

В API документация TimeZone.getDefault() говорится, что «источником по умолчанию TimeZone может меняться в зависимости от реализации.» Если ваш код зависит от специфики реализации стандартных классов API (в данном случае, что часовой пояс по умолчанию поддерживается на локальном уровне потока), вы должны ожидать, что ваш код завершится неудачей с более новыми версиями VM или с виртуальными машинами из разных поставщики.