Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 日历空对象_Java_Calendar - Fatal编程技术网

Java 日历空对象

Java 日历空对象,java,calendar,Java,Calendar,我有一个这样的类,其中calendar对象是可选的。如果未调用setCal(),而有人调用getCal()方法,是否有任何选项而不是返回null。如果返回null,那么我必须在任何地方进行null检查。是否有任何类可以扩展calendar而不执行任何类似于Null对象模式的操作 调用getCal()时,这里的最佳选项是什么?如果未调用setCal,那么如果未设置cal,为什么要发送除null之外的其他内容? 在这种情况下,null是最好的返回方式。Null也是一个值,它向开发人员提供指示。 而且

我有一个这样的类,其中calendar对象是可选的。如果未调用setCal(),而有人调用getCal()方法,是否有任何选项而不是返回null。如果返回null,那么我必须在任何地方进行null检查。是否有任何类可以扩展calendar而不执行任何类似于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;
    }