美文网首页
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