21

我知道这可能是一个显而易见的问题,但我正在查看这段代码:

private Date lastActivity = new Date(-1);

我很好奇这是做什么的 - Date 类有六个不同的构造函数,只有一个可以接受一个参数long,如下所示:

public Date(long date)

哪一个:

分配一个 Date 对象并将其初始化以表示自称为“纪元”的标准基准时间(即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。

那么 -1 只是一个占位符吗?我感谢任何提示或建议。

4

4 回答 4

19

它是January 1, 1970, 00:00:00 GMT 负一毫秒(负数是纪元开始后的日期)

于 2012-06-03T20:21:17.287 回答
17

通常这样做是为了获得一个“众所周知的”日期,也许是为了验证或比较(所有“真实日期”都大于这个日期),作为一个“标记对象”来指示日期确实未知/非法/待定但是您出于某种原因不想使用 null ,或者可能用于单元测试。

好的,为我所谓的“标记值”查找更合适的术语,我得到哨兵值、标志值、跳闸值、流氓值、信号值或虚拟数据。在此处查看维基百科文章

于 2012-06-03T20:16:49.193 回答
5

那么 -1 只是一个占位符吗?我感谢任何提示或建议。

可能不是在通常使用术语占位符的意义上。(那是代表……或为……别的东西占有一席之地的东西。)

它更有可能是一个代表计算目的的边界条件的值。在这种特殊情况下,变量名称lastActivity似乎暗示了这一点。我想这是确定“活动”的最新时间的某种算法的一部分......并且该Date(-1)对象将被视为“从未发生过活动”。他们也可以使用nullor 标志来表示这一点……但是使用“时髦”的 Date 对象可能会稍微简化算法的逻辑。

“哨兵价值”是一个很好的术语……但“标记价值”不太好,因为它实际上并没有标记任何东西。

(从某种意义上说,选择-1是任意的。它可以是任何值……只要它不对应于算法可能遇到的时间点。-1如果时间点总是在 UNIX 时代之后...... 1970 年 1 月 1 日。但如果它可能必须处理历史日期,那么可能Long.MIN_VALUE会更好。无论哪种方式......这在你的家庭作业中都可能没有实际意义。)

于 2012-06-04T02:00:28.013 回答
4

这称为哨兵值。它的意义通常是表示数据不可用,一系列数据已经结束等。通过使用特定的、明显无效的值,您可以节省维护单独isValidisFinished字段的工作。

对于这是否是好的做法,意见不一。当约定非常有名时,例如在\0终止 C 字符串的 ASCII 中,它被普遍接受。在其他情况下,您通常可能会扩大未来被认为是“有效”的范围,然后在处理遗留数据时您将陷入困境。它也违反了单一责任原则:那条数据可以代表两条完全不同的信息,这会损害可维护性,因为代码阅读器可能没有意识到隐藏的潜在特殊含义,并且类型系统无法帮助您发现它.

于 2012-06-04T06:13:39.850 回答