java.text.dateformat,调用静态java.text.DateFormat的方法不可取吗?

I am receiving a Find Bugs error - call to method of static java.text.DateFormat and

I don't know the reason why it's not good / advisable to be doing these things below.

private static final Date TODAY = Calendar.getInstance().getTime();

private static final DateFormat yymmdd = new SimpleDateFormat("yyMMdd");

private String fileName = "file_" + yymmdd.format(TODAY);

解决方案

DateFormats are not thread-safe, meaning that they maintain an internal representation of state. Using them in a static context can yield some pretty strange bugs if multiple threads access the same instance simultaneously.

My suggestion would be to make your variables local to where you're using them instead of making them static properties of the class. It looks like you might be doing this when you're initializing the class, so you could do this in the 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);

}

...

}

And if you need to use the formatter in multiple places, you might just make the pattern static final and create a new local DateFormat when needed:

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

}

}

The FindBugs documentation for the issue says:

As the JavaDoc states, DateFormats are

inherently unsafe for multithreaded

use. The detector has found a call to

an instance of DateFormat that has

been obtained via a static field. This

looks suspicous.

For more information on this see Sun

Bug #6231579 and Sun Bug #6178997.

Date formats are not synchronized. It

is recommended to create separate

format instances for each thread. If

multiple threads access a format

concurrently, it must be synchronized

externally.

Jack Leow's answer also has a good point about the semantics of your static use of "TODAY".

As an aside, I've actually seen this happen in a high-traffic production environment, and it's a very confusing thing to debug at first; so in my experience the FindBugs warning is actually a useful suggestion (unlike some other static analysis rules, which sometimes seem to be nitpicky).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值