好的,作为一个新的android开发人员,我发现(到目前为止)只有Calendar类使用数组来存储其字段,并创建一个整数常量来标记索引名称。例如:
public class Calendar{
...
public static final int ERA = 0;
public static final int YEAR = 1;
public static final int MONTH = 2;
protected int[] fields = null;
...
}
如果你想获得,例如日历的年份:
int year = Calendar.getInstance().get(Calendar.YEAR);
这种设计的目的是什么?我的意思是,为什么不使用类似的东西:
public class Calendar{
...
protected int year;
...
public int getYear() { return year; }
}
使用通常的getter方法访问它:
int year = Calendar.getInstance().getYear();
背后的原因是什么?
答案 0 :(得分:3)
它只是SOLID
,Open-Close
是严格的。 SOLID
想象一下,有一天,Oracle中有人会决定向Calendar
添加纳秒。它可以像在fields
和一个名为NANOSECONDS的字段中添加一个单元一样简单。这只是一个很好的设计。
他们不需要改变所有领域的循环。不需要反思。
嗯,它也是DRY
(不要重复自己)而不是WET
(我们喜欢打字)。为什么要键入所有这些getter和setter?它会使代码混乱并使其无法读取。 DRY
正如dit所指出的那样:
在设计add
方法时也很有用。现在,您只需指定一个字段和要添加的值,而不是使用{addYear, addMonth etc.}
中的相应方法。就废物每个人的时间而言,这将是非常WET
。
现在你可以简单地使用:
cal.add(Calendar.YEAR, 1);
将把年份改为下一年。
答案 1 :(得分:0)
也可以轻松更改日期。例如增加字段:
Calendar c = Calendar.getInstance();
c.add(Calendar.YEAR, 1); // one year later
c.add(Calendar.DATE, 1); // tomorrow
想象一下,如果没有xenteros所描述的软件设计,我们应该做些什么。