Calenderは単一の例ではありません


詳細
私たちが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));

2つのインスタンスの値は等しいが、参照は等しくないことがわかります.
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()メソッドで処理されるように、言語環境によって異なる処理をしなければなりません.だから、破壊しないほうがいいです.