【发布时间】:2011-09-21 11:29:23
【问题描述】:
我基于 JodaTime 成功编写了代表我公司财务日历的新年表。我参考了很多 JodaTime 源代码,以弄清楚我需要做什么。我在BasicChronology 类中注意到的一件事是使用内部类YearInfo 来缓存'firstDayOfYearMillis'——自1970-01-01 (ISO) 以来的毫秒数。考虑到,如果 JodaTime 缓存它的性能瓶颈就足够了,我可能也应该将它添加到我的年表中。
不过,当我这样做时,我做了一些修改。具体来说,我将getYearInfo 方法移动到YearInfo 内部类中,并使其成为静态的。我还将用于存储缓存值的数组也移动到了内部类中。修改类的完整定义是这样的:
/**
* Caching class for first-day-of-year millis.
*
*/
private static final class YearInfo {
/**
* Cache setup for first-day-of-year milliseconds.
*/
private static final int CACHE_SIZE = 1 << 10;
private static final int CACHE_MASK = CACHE_SIZE - 1;
private static transient final YearInfo[] YEAR_INFO_CACHE = new YearInfo[CACHE_SIZE];
/**
* Storage variables for cache.
*/
private final int year;
private final long firstDayMillis;
private final boolean isLeapYear;
/**
* Create the stored year information.
*
* @param inYear The year to store info about.
*/
private YearInfo(final int inYear) {
this.firstDayMillis = calculateFirstDayOfYearMillis(inYear);
this.isLeapYear = calculateLeapYear(inYear);
this.year = inYear;
}
/**
* Get year information.
*
* @param year The given year.
*
* @return Year information.
*/
private static YearInfo getYearInfo(final int year) {
YearInfo info = YEAR_INFO_CACHE[year & CACHE_MASK];
if (info == null || info.year != year) {
info = new YearInfo(year);
YEAR_INFO_CACHE[year & CACHE_MASK] = info;
}
return info;
}
}
我的问题是...我的更改对性能或设计有何影响?我已经决定我的更改应该是线程安全的(给出关于最终成员变量的答案)。但是为什么最初的实现是这样完成的,而不是这样呢?我明白为什么大多数静态有效使用的方法都不是(给定BasicChronology 的子类),但我承认我的一些面向对象设计的东西有点生疏(过去两年一直在使用 RPG ).
所以...想法?
【问题讨论】:
标签: java caching static jodatime