日历空对象

时间:2014-05-22 21:40:36

标签: java calendar

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()时,这里的最佳选择是什么?

6 个答案:

答案 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)。虽然,应该小心谨慎,因为返回表示“空”的封装可能不会被注意到,除非经过仔细记录并同意作为惯例(例如与您的团队一致)。