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;
}
}
我有一个这样的类,其中日历对象是可选的。如果没有调用setCal()并且有人调用getCal()方法,那么是否有任何选项而不是返回null。如果返回null,那么我必须在每个地方进行空检查。是否有任何类扩展日历而不执行任何类似Null对象模式的操作。
当调用getCal()时,这里的最佳选择是什么?
答案 0 :(得分:0)
如果未调用setCal
,如果未设置cal
,为什么要发送除null
以外的其他内容?
在这种情况下,null
是最好的回报。 Null也是一个值,它指示开发人员。
并且,因为开发人员不知道你的getCal
无法返回null,即使你永远不会返回null,他们也会检查null(我认为对于getter和setter,开发人员不会这样做)。读了javadoc)。
也许您可以发送默认日历的新实例。但默认值是当前日期,所以我认为这不是一个好主意,因为它不代表日历尚未设置的事实。
或者您可以抛出异常......但不要滥用异常。异常旨在定义错误或不良行为,而不是简化功能检查。
但是,为了保护setCal
null值的方法,如果用户设置为null值,这里可以抛出IllegalArgumentException
。
答案 1 :(得分:0)
这样会解决你的问题吗?
public Calendar getCal() {
if (cal != null)
return cal;
return Calendar.getInstance(); // to be returned when cal is null
}
答案 2 :(得分:0)
这里最好选择返回null和null检查,其他方面,你可以做的是
如果适合您的情况,请将日历初始化为今天。
或
抛出异常并要求设置日历。
答案 3 :(得分:0)
只需向属性添加默认值:
private Calendar cal = Calendar.getInstance();
答案 4 :(得分:0)
如果你反对在代码中检查null,你可以实现类似的东西:
public boolean hasCal(){
if(this.cal == null){
return false;
}
return true;
}
这会使您的代码更具可读性,但即使getCal()
对象没有,也仍需要Test
返回某些内容,并且返回null
似乎是在这种情况下最好的选择。
答案 5 :(得分:0)
您的代码的上下文不明确,根据上下文返回null可能是有利的。但总的来说,当你试图说“我没有信息要回馈”时,那么返回null就会清楚地显示出来。此外,它使其他人更容易观察到它。
是否有任何选项而不是返回null。
事实上,还有很多其他方式;这取决于具体情况。另一个例子是'Option Pattern'。它的想法依赖于封装可选值;无或原始数据。这样你就可以返回一个有意义的值(在Haskell中使用很多,在某种程度上也是Scala)。虽然,应该小心谨慎,因为返回表示“空”的封装可能不会被注意到,除非经过仔细记录并同意作为惯例(例如与您的团队一致)。