为什么要实例化一个以-1为参数的Date?

时间:2012-06-03 20:14:23

标签: java datetime

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

private Date lastActivity = new Date(-1);

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

public Date(long date)

其中:

  

分配Date对象并初始化它以表示指定的对象   自标准基准时间以来称为“。”的毫秒数   时代“,即1970年1月1日,格林尼治标准时间00:00:00。

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

4 个答案:

答案 0 :(得分:19)

January 1, 1970, 00:00:00 GMT 减去一毫秒 (负数是纪元开头后面的日期)

答案 1 :(得分:17)

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

O.K。,查找我称之为“标记值”的更合适的术语,我得到了标记值,标记值,跳闸值,流氓值,信号值或虚拟数据。见wikipedia article here

答案 2 :(得分:5)

  

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

可能不是通常使用术语占位符。 (这是代表......或者为......别的东西占有一席之地。)

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

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

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

答案 3 :(得分:4)

这称为sentinel value。其重点通常是指示数据不可用,一系列数据已经结束等。通过使用特定的,显然无效的值,您可以节省维护单独的isValidisFinished字段。

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