为什么Java Calendar会在数组中存储字段而不是通用字段?

时间:2016-10-07 05:13:35

标签: java android

好的,作为一个新的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();

背后的原因是什么?

2 个答案:

答案 0 :(得分:3)

它只是SOLIDOpen-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所描述的软件设计,我们应该做些什么。