我正在對日期格式代碼進行一些重構,因爲我們設法因各種原因引入了許多不一致的地方。我知道最好有一個ThreadLocal
SimpleDateFormat
。在討論這裏之後,我們不確定在Enum中使用ThreadLocal是否是必需的,因爲我們從不改變實例並且不公開它,因此它不能被突變?如果它是是還需要做一個Enum,像這樣,破壞什麼?其他事情是否已經破裂或者沒有做到我認爲應該做的事情?基本上我沒有必須使用ThreadLocal進行很多工作,我不確定這些影響,特別是它與Enum的交互方式。Enum中的ThreadLocal SimpleDateFormat?
public enum DateFormat {
DATE(newThreadLocalSimpleDateFormat("MM/dd/yyyy")),
LONG_DATE(newThreadLocalSimpleDateFormat("MMMM dd, yyyy")),
TIMESTAMP(newThreadLocalSimpleDateFormat("MM/dd/yyyy hh:mm:ss aa"));
private transient final ThreadLocal<SimpleDateFormat> formatter;
DateFormat(final ThreadLocal<SimpleDateFormat> formatter) {
this.formatter = formatter;
}
public String format (final Date date) {
return this.formatter.get().format(date);
}
private static ThreadLocal<SimpleDateFormat> newThreadLocalSimpleDateFormat(final String frmtString) {
return new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat(frmtString);
}
};
}
}
'SimpleDateFormat'不是線程安全的。事實上,你在枚舉中引用了一個沒有任何區別。 – 2014-11-21 16:05:49
如果你不改變SDF的狀態,那麼你不需要ThreadLocal。 – SMA 2014-11-21 16:08:18
@almas這不夠好。解析方法也修改SDF的狀態。 – 2014-11-21 16:12:07