代码之家  ›  专栏  ›  技术社区  ›  Bad Request

为什么日历(JavaAPI)中的日期是静态的

  •  1
  • Bad Request  · 技术社区  · 14 年前

    我在查看JavaAPI中的Calendar类源代码时,注意到很多变量,例如。 DAY_OF_MONTH , YEAR 等被宣布为 static final . 这让我觉得奇怪,因为我认为日历实例的日期应该(1)特定于该实例,即非静态的和(2)可更改的(因此可以设置)。有人能澄清一下吗?谢谢!

    4 回复  |  直到 14 年前
        1
  •  13
  •   Carl Manaster    14 年前

    它是一个 明示常量 特别 一个月的某一天,但是 每月的第天。

    例如,我想添加(将日历日期增加)一个月:

        c.add ( Calendar.MONTH, 1 ) 
    

    我想补充一天:

       c.add ( Calendar.DAY_OF_YEAR, 1 ) ;
    

    我用第一个参数调用同一个函数 明示常量 我要递增/递减的日历字段的(当然,任何特定字段的递增/递减都可能会更改其他字段:如果我将一天添加到2099年12月31日,则“月的日”、“月”和“年”字段都将更改。)

    另一种方法是为每个字段设置不同的设置器,例如,

     addMonth( int n ) ;
     addDayOfYear( int n);
    

    然而,这会使编写一些用例变得更加乏味。


    OP问:

    有人能告诉我当你调用cal.set(2010,8,2)时会发生什么吗?cal是一个日历?我想知道的是编译器如何将2连接到DATE OF the MONTH,或者2在堆中的什么位置,或者2存储在什么限定变量名下。谢谢所有回答的人!

    “严格的”面向对象的答案是,“作为使用日历而不是实现日历的客户机程序员,您不需要了解日历的内部布局或算法”。

    真正的答案是Calendar是一个接口,所以任何特定的实现类都可以通过多种方式来完成这些事情,只要实现遵循公共接口 日历接口的语义。

    例如,GregorianCalendar的实际实现可能是在内部,它将日期保存为某个特定日期之后的秒数,例如linux“纪元”(1970年1月1日)或公历的第一个机构(1582年10月15日)。

    所以呢 cal.set(2010, 8, 2) 可能把一年乘以365*24*60*60,再加上任何闰年 8 用于查找到第七个月底的秒数(再次说明闰日,如果有的话),2加上两天的秒数,以此类推。

        2
  •  5
  •   Carl Manaster    14 年前

    calendar.get(key) . 例如:

    int dayOfMonth = concreteCalendar.get(Calendar.DAY_OF_MONTH);
    
        3
  •  2
  •   Jay    14 年前

    如果他们创建了名为“getDayOfMonth”、“getMonth”、“getYear”等的函数,可能会更直观。也许这在某种程度上更有效地实现了,或者他们认为Calendar类应该可以扩展到任何日历,所以如果您想创建,比如说,“MayanCalendar extensed Calendar”,然后可以为KATUN和BAKTUN等定义新的常量,它将与现有的set和get函数一起工作。

        4
  •  1
  •   Carl Manaster    14 年前