美文网首页
JDK Calendar

JDK Calendar

作者: dylan丶QAQ | 来源:发表于2020-11-11 11:36 被阅读0次

起因:在工作中常常要用到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);//运算值,后面可以是正数也可以是负数

不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!

相关文章

网友评论

      本文标题:JDK Calendar

      本文链接:https://www.haomeiwen.com/subject/ryjebktx.html