日期:2014-05-20  浏览次数:20887 次

Calendar类的静态常量和set()、get()方法为什么可以改变其值
Calendar c=Calendar.getInstance();
c.set(Calendar.YEAR, 2013);//设置年份
c.set(Calendar.MONTH, 1);//设置月份
int day=c.getActualMaximum(Calendar.DATE);//获得本月的天数
求解:Calendar类中YEAR、MONTH等是一个个的静态的常量,为什么Calendar类中的set()方法可以设置其值,设置的到底是一个什么的值呢?

------解决方案--------------------
引用:
引用:set(f, value) 将日历字段 f 更改为 value,我的理解是,Calendar中的year,month等表示的是一个属性名,是一个字段,而set就是给字段赋值的方法,在一个get方法调用之前,set虽然是立即改变calendar对象的状态,但是没有真正的改变其值,只有在调用get的时候,才会真正的计算,提高效率
没明白……


Calendar是个抽象类,你可以理解Calendar.Month为子类的一个属性,c.set(Calendar.Month,1)的意思就是一个Calendar实体类对象的Month属性为2
------解决方案--------------------
Calendar.YEAR, Calendar.MONTH 等都是作为 key 来使用的。

设想你来实现 Calendar 类,对于设置其状态的方法,你可以这么写:


public void setYear(int year){ ... }
public void setMonth(int month){ ... }
... ...


这样写,最终你要写很多个方法,
或者,你只写一个 set() 方法,然后让它接受两个参数,第一个参数表示你要设置哪个状态,第二个参数表示值:


public void set(int key, int value);


对于其中的 key , 你规定: 0 表示 年, 1 表示 月 …………………… 等等,
然后你发现,你的规定只有你知道,用户不愿意去记那么多,所以你把它们写成公共静态常量:


public static final int YEAR = 0;
public static final int MONTH = 1;
... ...


用户就可以这么调用:  c.set(Calendar.YEAR, 2013); 
而不是只能这么写了: c.set(0, 2013);
这样用户只要去记名字而不用去记数字,同时也提高了可读性。

Calendar 这个类有年头了,如果现在写的话,更好的方案不是用int来做key,而是用enum。