我已经成功地编写了一个新的代表我公司财政日历的年表,基于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
的子类),但我承认我的一些OO设计有点生疏(在过去两年中使用RPG)。
所以......想法?