Java 日历空对象
我有一个这样的类,其中calendar对象是可选的。如果未调用setCal(),而有人调用getCal()方法,是否有任何选项而不是返回null。如果返回null,那么我必须在任何地方进行null检查。是否有任何类可以扩展calendar而不执行任何类似于Null对象模式的操作Java 日历空对象,java,calendar,Java,Calendar,我有一个这样的类,其中calendar对象是可选的。如果未调用setCal(),而有人调用getCal()方法,是否有任何选项而不是返回null。如果返回null,那么我必须在任何地方进行null检查。是否有任何类可以扩展calendar而不执行任何类似于Null对象模式的操作 调用getCal()时,这里的最佳选项是什么?如果未调用setCal,那么如果未设置cal,为什么要发送除null之外的其他内容? 在这种情况下,null是最好的返回方式。Null也是一个值,它向开发人员提供指示。 而且
调用getCal()时,这里的最佳选项是什么?如果未调用
setCal
,那么如果未设置cal
,为什么要发送除null
之外的其他内容?
在这种情况下,null
是最好的返回方式。Null也是一个值,它向开发人员提供指示。
而且,因为开发人员不知道您的getCal
不能返回null,所以即使您从未返回null,他们也会检查null(我假设对于getter和setter,开发人员不读取javadoc)
也许您可以发送默认日历的新实例。但默认值是当前日期,所以我认为这不是一个好主意,因为它并不代表日历尚未设置的事实
或者你可以抛出一个异常。。。但不要滥用例外。异常设计用于定义错误或不良行为,而不是简化函数检查。
但是,为了保护空值的
setCal
方法,如果用户设置空值,您可以在这里抛出IllegalArgumentException
。类似的方法可以解决您的问题吗
public class Test {
//required fields
private String str1;
private String str2;
//optional
private Calendar cal;
public Test(String a, String b){
str1 = a;
str2 = b;
}
//getter for str1 and str2
public void setCal(Calendar cal){
this.cal = cal;
}
public Calendar getCal() {
return cal;
}
}
返回null和null检查是这里的最佳选择,其他方面,您可以做的是 如果适合您的场景,将日历初始化到今天 或
抛出异常并要求设置日历。只需向属性添加默认值:
public Calendar getCal() {
if (cal != null)
return cal;
return Calendar.getInstance(); // to be returned when cal is null
}
如果您反对在所有代码中检查null,您可以实现如下内容:
private Calendar cal = Calendar.getInstance();
这将使您的代码更具可读性,但即使
Test
对象没有返回内容,您仍然必须返回getCal()
,在这种情况下,返回null
似乎是最好的选择。代码的上下文不清楚,根据上下文的不同,返回null可能是有利的。但一般来说,当您试图说“我没有信息要反馈”时,返回null就清楚地表明了这一点。此外,它使其他人更容易观察到这一点
是否有任何选项而不是返回null
事实上,还有很多其他的方法;这取决于上下文。另一个示例是“”。其思想依赖于封装可选值;要么没有,要么是原始数据。通过这种方式,您可以返回一个有意义的值(在Haskell和Scala中大量使用)。尽管如此,在返回表示“空”的封装时要小心,除非仔细记录并作为惯例(例如与您的团队)达成一致意见,否则可能不会注意到它。如果它确实是一个可选字段,为什么代码中到处都有试图提取值的地方?只需在未设置日历时使用适当的默认值将该行为封装到所属类中,并去掉
getCal()
。您将拥有一个具有当前日期的日历,因此,它并不表示未设置日历。它返回默认值,因此当前日历为。不要认为这是件好事。
public boolean hasCal(){
if(this.cal == null){
return false;
}
return true;
}