2010-01-08 51 views
5

我有一个类“deletionDate”和“experiationDate”这两个字段都可以是未定义的,这意味着该对象是否被删除,也没有到期日期。如何用java.util.Date表示“never”?

我的第一种方法是:

private Date deletionDate = null; // null means not deleted 

铭记书“清洁守则”我记得更好的使用表现力的名称,而不是评论。所以我目前的解决方案是:

private static final Date NEVER = null; 
private Date deletionDate = NEVER; 

我可以用户围绕日期的包装类,但这会使JPA映射复杂。

您对此有何看法?你会如何表达“从不”?

回答

11

以及永不从来都不是,而不是2999年1月1日。

我会留下你的第一个解决方案。一个空日期意味着它还没有发生。

boolean isNeverDeleted(){ 
    return deletionDate == null; 
} 
+1

+1,决不是永远。^ – KB22 2010-01-08 11:26:14

+1

也为+1绝不是从来没有的,但请注意,使用空的问题表示“设置为永不”的是,它意味着你不需要再有一种方法来表明“尚未设置”。 这是一个应用程序问题,即是否是重要的,但它很容易想象OP后来发现需要保存的值是否已设置的轨道,导致需要第二次‘布尔hasBeenSet’变量对每个,这将是恶心。 – CPerkins 2010-01-08 18:37:54

+0

注意,*如果*您选择'null'对于这一点,你一定要记录这个意思。作为@CPerkins笔记,'null'的确切含义可以根据具体情况逐案有所不同。有时'null'是错误的(即:不能永远进行设置),有时它的意思是“未知”,有时它的意思是“尚未设置”,... – 2011-06-07 08:12:46

-1

我只是选择远期日期作为常数NEVER的值。然后检查是否删除/过期,只需要比较一下。

+1

这将是今年在8099 – 2010-01-08 11:25:35

+0

有这个可能的问题是,如果你做任何范围或订购业务则具有大,但实际值可能会做一些意想不到的。 – GaryF 2010-01-08 11:27:25

+0

Noooooo!不要使用未来的日期!你没有从Y2k或SpamAssassin学到什么吗? :( – Bombe 2010-01-08 11:40:33

0

让默认值被当成“从不”

3

你可以考虑一下空日期为“不可用”或“不适用”:

也许你可以用类似包裹。如果是这种情况,“无日期”适用于“从不”。

不要仅为了非常精致的样式要求才对子类型进行子类型化。

更好的选择是将语义添加到模型对象。如果你有一个deletionDate财产的事情对象,你可以这样做:

​​

,这将是实用和documentative,无论是在课堂上和您的客户端代码:

if(myThing.isNeverDeleted()) 
3

我认为null合适。它清楚地表明“未设置”。

根据你想要得到多么复杂,你可以有一个Enum并且有一个像'NeverExpires'这样的'UserState'(或者你所代表的任何东西)。这可能是可取的,但可能无用复杂,取决于你的系统。

-1

我不会使用Date,而是使用时间戳,使用-1表示永不会,0表示立即;属性的

public static final long IMMEDIATE = 0; 
public static final long NEVER = -1L; 
private long expires = NEVER; 

解释应该在吸气剂,如:

public boolean isExpired() { 

    return (NEVER == expires) ? false : (expires < System.currentTimeMillies()); 
} 

缺失遵循相同的模式。

更新我知道,0和-1是有效的时间戳,但由于到期以及文件和其他资源很少的缺失(永不说永不:-))在1970年或之前发生的,它是一个有用的常数,恕我直言。

+0

-1是一个有效的时间戳(23:59:59.999 UTC 1969年12月31日)。 – jarnbjo 2010-01-08 11:55:49