java.util.Calendar是不是单例模式?

单例模式应该满足每个该类的对象都指向同一块内存区域吧,Calendar显然满足。

但在这里(http://raychase.iteye.com/blog/1471015)看到说“这种形式可以看做是单例的一个变体。”,变体怎么理解?

package test;


import java.util.Calendar;


public class LeakTest {


    /**

     * @param args

     */

    public static void main(String[] args) {

        Calendar c1 = Calendar.getInstance();

        Calendar c2 = Calendar.getInstance();

        Runtime run1 = Runtime.getRuntime();

        Runtime run2 = Runtime.getRuntime();

        System.out.println("c1.equals(c2) is " + c1.equals(c2));

        System.out.println("c1 == c2 is " + (c1 == c2));

        System.out.println("run1.equals(run2) is " + run1.equals(run2));

        System.out.println("run1 == run2 is " + (run1 == run2));

    }

    

}


小怪兽爱吃肉
浏览 899回答 2
2回答

MYYA

单例模式表示返回的永远是同一个对象,即对象的引用是相同的。 c1&nbsp;==&nbsp;c2&nbsp;is&nbsp;false 说明Calendar&nbsp;不是单例模式。从实际情况分析也应该不是单例,如果c1、c2是同一个对象,那么你修改c1时会影响到c2,时间就没办法比较了。 Runtime&nbsp;是单例模式。 可以参看下openjdk的源码:public&nbsp;abstract&nbsp;class&nbsp;Calendar&nbsp;implements&nbsp;Serializable,&nbsp;Cloneable,&nbsp;Comparable<Calendar>&nbsp;{//.....&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;Calendar&nbsp;getInstance() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;cal&nbsp;=&nbsp;createCalendar(TimeZone.getDefaultRef(),&nbsp;Locale.getDefault()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cal.sharedZone&nbsp;=&nbsp;true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;cal; &nbsp;&nbsp;&nbsp;&nbsp;}//......... &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;Calendar&nbsp;createCalendar(TimeZone&nbsp;zone, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Locale&nbsp;aLocale) &nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;If&nbsp;the&nbsp;specified&nbsp;locale&nbsp;is&nbsp;a&nbsp;Thai&nbsp;locale,&nbsp;returns&nbsp;a&nbsp;BuddhistCalendar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;instance. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;("th".equals(aLocale.getLanguage())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&&&nbsp;("TH".equals(aLocale.getCountry())))&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;sun.util.BuddhistCalendar(zone,&nbsp;aLocale); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;("JP".equals(aLocale.getVariant())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&&&nbsp;"JP".equals(aLocale.getCountry())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&&&nbsp;"ja".equals(aLocale.getLanguage()))&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;JapaneseImperialCalendar(zone,&nbsp;aLocale); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;else&nbsp;create&nbsp;the&nbsp;default&nbsp;calendar &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;GregorianCalendar(zone,&nbsp;aLocale); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;public&nbsp;class&nbsp;Runtime&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;Runtime&nbsp;currentRuntime&nbsp;=&nbsp;new&nbsp;Runtime();&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;Runtime&nbsp;getRuntime()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;currentRuntime; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;/**&nbsp;Don't&nbsp;let&nbsp;anyone&nbsp;else&nbsp;instantiate&nbsp;this&nbsp;class&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Runtime()&nbsp;{}//.....}

繁华开满天机

和我犯的一样的错,告诉你它不是单例。因为getInstance()方法得到的对象要求是不同的对象。比如今天5点,明天3点。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java