我正在对日期格式代码进行一些重构,因为我们设法因各种原因引入了许多不一致的地方。我知道最好有一个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