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;
}
}
我有这样一个类,其中calendar对象是可选的。如果setCal()没有被调用,而有人调用getCal()方法,是否有任何选项,而不是返回null。如果返回null,那么我必须在每个地方做null检查。是否有任何类扩展calendar,而不做任何类似Null对象模式的事情。
调用getCal()时,这里的最佳选项是什么?
6条答案
按热度按时间0md85ypi1#
像这样的东西能解决你的问题吗?
flvtvl502#
返回null和null检查在这里是最好的选择,否则,您可以做的是
如果适合您的场景,将日历初始化为今天。
或
抛出异常并请求设置日历。
lfapxunr3#
只需向属性添加默认值:
ac1kyiln4#
如果
setCal
没有被调用,那么如果cal
没有被设置,为什么要发送null
以外的东西呢?null
是这种情况下最好的返回值。Null也是一个值,给予开发人员一个指示。而且,因为开发人员不知道你的getCal
不能返回null,即使您从不返回null,它们也会检查null(我假设开发人员不阅读javadoc中的getter和setter)。也许你可以发送一个默认日历的新示例。但是默认值是当前日期,所以我不认为这是一个好主意,因为它不代表日历还没有设置的事实。
或者你可以抛出一个异常...但是不要滥用异常。异常被设计用来定义错误或不良行为,而不是简化函数检查。但是,为了保护
setCal
方法的空值,如果用户设置了空值,你可以抛出一个IllegalArgumentException
。uqzxnwby5#
如果你反对在整个代码中检查null,你可以实现如下的方法:
这将使代码更具可读性,但是即使
Test
对象没有返回值,您仍然必须让getCal()
返回一些值,在这种情况下,返回null
似乎是最好的选择。b1uwtaje6#
代码的上下文不清楚,根据上下文返回null可能是有利的。但一般来说,当你试图说“我没有信息要给予”时,返回null会清楚地表明这一点。此外,它还使其他人更容易观察到这一点。
除了返回null之外还有什么选择吗?
其实,还有很多其他的方法;这取决于上下文。一个可供选择的例子是“Option Pattern”。它的思想依赖于封装一个可选值;None或原始数据。这样你就可以返回一个有意义的值(这在Haskell中大量使用,在某种程度上也在Scala中使用)。尽管如此,还是应该小心,因为返回一个指示'empty'的封装可能不会被注意到,除非仔细记录并作为一种约定(例如与您的团队达成一致)。