java 日历空对象

lsmd5eda  于 2023-01-19  发布在  Java
关注(0)|答案(6)|浏览(115)
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()时,这里的最佳选项是什么?

0md85ypi

0md85ypi1#

像这样的东西能解决你的问题吗?

public Calendar getCal() {
    if (cal != null)
        return cal;
    return Calendar.getInstance(); // to be returned when cal is null
}
flvtvl50

flvtvl502#

返回null和null检查在这里是最好的选择,否则,您可以做的是
如果适合您的场景,将日历初始化为今天。

抛出异常并请求设置日历。

lfapxunr

lfapxunr3#

只需向属性添加默认值:

private Calendar cal = Calendar.getInstance();
ac1kyiln

ac1kyiln4#

如果setCal没有被调用,那么如果cal没有被设置,为什么要发送null以外的东西呢?null是这种情况下最好的返回值。Null也是一个值,给予开发人员一个指示。而且,因为开发人员不知道你的getCal不能返回null,即使您从不返回null,它们也会检查null(我假设开发人员不阅读javadoc中的getter和setter)。
也许你可以发送一个默认日历的新示例。但是默认值是当前日期,所以我不认为这是一个好主意,因为它不代表日历还没有设置的事实。
或者你可以抛出一个异常...但是不要滥用异常。异常被设计用来定义错误或不良行为,而不是简化函数检查。但是,为了保护setCal方法的空值,如果用户设置了空值,你可以抛出一个IllegalArgumentException

uqzxnwby

uqzxnwby5#

如果你反对在整个代码中检查null,你可以实现如下的方法:

public boolean hasCal(){
        if(this.cal == null){
            return false;
        }
        return true;
    }

这将使代码更具可读性,但是即使Test对象没有返回值,您仍然必须让getCal()返回一些值,在这种情况下,返回null似乎是最好的选择。

b1uwtaje

b1uwtaje6#

代码的上下文不清楚,根据上下文返回null可能是有利的。但一般来说,当你试图说“我没有信息要给予”时,返回null会清楚地表明这一点。此外,它还使其他人更容易观察到这一点。
除了返回null之外还有什么选择吗?
其实,还有很多其他的方法;这取决于上下文。一个可供选择的例子是“Option Pattern”。它的思想依赖于封装一个可选值;None或原始数据。这样你就可以返回一个有意义的值(这在Haskell中大量使用,在某种程度上也在Scala中使用)。尽管如此,还是应该小心,因为返回一个指示'empty'的封装可能不会被注意到,除非仔细记录并作为一种约定(例如与您的团队达成一致)。

相关问题