`
men4661273
  • 浏览: 278216 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Calender不是单例

    博客分类:
  • java
阅读更多

         在我们使用Calender的时候,使用过Calendar.getInstance()来获取一个日期类的对象,这种方式跟单例的获取方式一样,那么它到底是不是单例呢,如果是单例的话,一个对象修改内容之后,另外一个线程中的数据不久乱套了吗?从试验以及源码中可以得出,Calendar不是单例。

测试:

  Calendar c1 = Calendar.getInstance();
  Calendar c2 = Calendar.getInstance();
  //输出true
  System.out.println("c1.equals(c2) is : "+c1.equals(c2));
  //输出false
  System.out.println("c1 == c2 is : "+ (c1 == c2));

 可以看出,两个实例的值相等,但是引用却不相等。

下面看看jdk的源码中的写法:

 

 
 public static Calendar getInstance()
    {
        Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault());
 cal.sharedZone = true;
 return cal;
    }


private static Calendar createCalendar(TimeZone zone,
        Locale aLocale)
    {
 // If the specified locale is a Thai locale, returns a BuddhistCalendar
 // instance.
//泰国环境
 if ("th".equals(aLocale.getLanguage())
     && ("TH".equals(aLocale.getCountry()))) {
     return new sun.util.BuddhistCalendar(zone, aLocale);
//日本环境
 } else if ("JP".equals(aLocale.getVariant())
     && "JP".equals(aLocale.getCountry())
     && "ja".equals(aLocale.getLanguage())) {
     return new JapaneseImperialCalendar(zone, aLocale);
 }	    

 // else create the default calendar
//默认环境
        return new GregorianCalendar(zone, aLocale);
    }

 

       可以看出,根据不同的语言环境,创建了不同的日期对象实例,低版本的JDK中,只对泰语做了特殊处于,高版本中又增加了日本的,具体实现有何不同,可以去看一下具体不同日期类的实现。

      而至于Calendar为什么用Calendar.getInstance()来获取实例对象,是因为它本身是个抽象类,是各种日期类实现类的父类,提供了Calendar.getInstance()给我们方便调用,根据不同的语言环境采取不同的实现,JDK帮我们封装了这些细节,所以直接使用

GregorianCalendar c1 = new GregorianCalendar();

 

来创建日期类的实例,其实也是可以的,但无疑破坏了封装性,多态性,我们也得像getInstance()方法里面处理的一样,根据不同的语言环境做不同的处理,所以我们还是不要破坏的好。
分享到:
评论

相关推荐

    calender.js代码

    采用javascript实现calender

    Calender日历组件

    在Android开发中,`Calender`日历组件是构建时间管理类应用不可或缺的一部分。它允许开发者为用户提供直观的日历视图,以便查看、添加和管理日期相关的事件。本篇文章将深入探讨`Calender`组件的核心功能,使用方法...

    android calender 源码

    本文将深入探讨“android calender”官方源码,分析其背后的实现机制、关键类和接口,以及如何利用这些源码来优化和自定义日历功能。 首先,Android Calendar应用的核心组件是`CalendarContract`,它是Android系统...

    calender_self_qt.zip

    我们将主要围绕"calender_self_qt.zip"中的内容展开,分析其设计原理、实现方法以及可能的应用场景。 Qt是一个流行的跨平台应用程序开发框架,广泛应用于桌面、移动和嵌入式设备。它提供了丰富的UI控件,包括用于...

    js+html Calender 日历

    这个名为 "js+html Calender 日历" 的项目,很可能是一个实现日历功能的前端代码库或教程,可以帮助开发者在网页上添加互动式的日期选择功能。下面将详细介绍相关的知识点。 1. **HTML**:HTML(超文本标记语言)是...

    ios calender

    `ios calender`这个项目提供了一个高质量的示例,展示了如何在iOS应用中集成和操作日历功能。以下将详细介绍iOS日历API的使用,以及在这个`JTCalendar-master`项目中可能涉及到的关键知识点。 首先,我们需要了解...

    Google Calender Sync

    同步Google Calender 至outlook

    calender.zip

    《自定义日历展示功能详解》 在日常的软件开发中,日历组件是一个不可或缺的部分,它能够帮助用户直观地查看和管理时间信息。本文将深入探讨如何创建一个自定义的日历展示功能,以实现诸如签到日期和活动日期的显示...

    日历Calender. js文件

    《深入解析JavaScript日历Calender.js文件》 在JavaScript编程领域中,日历功能是一个常见的需求,无论是网页应用、移动应用还是桌面应用,都离不开日期和时间的展示与操作。而今天我们要探讨的是一个名为"calender...

    mfc_calender.rar_MFC日历_calender c++_mfc 日历_日历

    解压后,我们可以看到文件名为"mfc_calender",这通常是一个工程文件,可能包含头文件、源代码文件、资源文件等,用于构建和编译日历应用程序。 "MFC日历"是指使用MFC库创建的日历组件。在MFC中,我们通常会用到...

    日历插件示例art-calender-test

    在本文中,我们将深入探讨日历插件的使用,特别是以"art-calender-test"为例。日历插件是Web开发中的一个重要工具,它能够帮助用户直观地查看和管理日期相关的事件,常用于网站的预约系统、日程管理、时间表展示等...

    calender.js

    日历控件,主要可以实现日程安排,根据时间查询

    calender_verilog_

    本项目"calender_verilog_"是利用Verilog语言实现的一个万年历功能,具备自动进位功能,可以准确计算400年内的日期。 在Verilog中,万年历的设计通常会涉及到以下几个核心知识点: 1. **模块定义**:在`calender.v...

    【ASP.NET编程知识】ASP.NET笔记之Calender的使用说明.docx

    ASP.NET 编程知识 - ASP.NET 笔记之 Calender 的使用说明 ASP.NET 中的 Calender 控件是开发者常用的一个控件,它可以帮助开发者快速创建一个日期选择器,提高用户体验。但是,如何正确使用 Calender 控件却是一个...

    Reminder to Calender.scriptable

    Reminder to Calender.scriptable

    Reminder to Calender.js

    Reminder to Calender.js

    android calender日历

    在Android平台上,开发一款日历应用是常见的需求,这涉及到对Android系统日历API的深入理解和使用。本文将详细介绍如何通过编程实现一个显示年月日、星期,并支持用户选择日期、切换月份和年的日历功能。...

    Calender按季度选择日期

    2. **UI渲染**:创建HTML结构来显示日历,并确保能显示季度而不是单个日期。可能需要四个独立的部分分别代表一年的四个季度。 3. **事件监听**:添加点击事件监听器到每个季度按钮,当用户选择一个季度时,更新显示...

    calender.rar

    calendar其实是一软件。 命令读取 calendar 文件并显示文件中包含今天或明天日期的任何行。calendar 文件是由用户创建的并且必须位于运行 calendar 命令的同一目录中。通常,calendar 文件驻留在主目录中。

Global site tag (gtag.js) - Google Analytics