起因:在工作中常常要用到Calendar类,刚好有空,在JDK中Calendar使用了单例模式,所以想要去了解一下。
1. 描述
public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>
Calendar类是一个抽象类,使用单例模式,构造方法的定义为protected,对外提供getInstance 方法。
2. 创建方式
Calendar的创建
Calendar rightNow = Calendar.getInstance();
其getInstance()方法有多个重载,最终调用createCalendar(TimeZone zone,Locale aLocale)方法,
那么如何保证其是单例的呢?
在其最终调用createCalendar方法中,有一方法LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale),
传入一个日历提供者,CalendarProvider.class,在LocaleProviderAdapter适配器中,使用concurrentMap存储CalendarProvider.class,
保证CalendarProvider唯一性,从而保证了Calendar的唯一性。
private static ConcurrentMap<Class<? extends LocaleServiceProvider>, ConcurrentMap<Locale, LocaleProviderAdapter>> adapterCache = new ConcurrentHashMap();
Calendar rightNow = Calendar.getInstance();
private static Calendar createCalendar(TimeZone zone,
Locale aLocale)
{
CalendarProvider provider =
LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale)
.getCalendarProvider();
if (provider != null) {
try {
return provider.getInstance(zone, aLocale);
} catch (IllegalArgumentException iae) {
// fall back to the default instantiation
}
}
...
3. 对API字段的解释
日历类,定义了许多的通用字段,用以区分在修改日历时,作用在不同的地方,(即用名字取分,实际又用数字去做操作)
//类似的有
public final static int YEAR = 1;
//月份的话,对每个月都做了对应的字段,
//我们在获取的时候,也是得到的他设置的对应的月的字段值,并非真正的月份,因为他之前设置的是0~11;所以就表示1~12月
public final static int MONTH = 2;
public final static int DATE = 5;
public final static int DAY_OF_YEAR = 6;
public final static int HOUR_OF_DAY = 11;
public final static int MINUTE = 12;
public final static int SECOND = 13;
public final static int MILLISECOND = 14;
4. 对API方法的解释
Calendar cal = Calendar.getInstance();//得到当前时间
cal.get(Calendar.YEAR);//get中传入API相应字段,获取相应的值
cal.getTime();//获取当前时间的Date
cal.set(Calendar.YEAR, 2014);//set中传入API相应字段,后面是想要改变的值
cal.setTime(Date date);//传入相应的日期Date
cal.add(Calendar.YEAR, 1);//运算值,后面可以是正数也可以是负数
不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!
网友评论