日历空对象

问题描述 投票:0回答:6
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() 时最好的选择是什么?

java calendar
6个回答
0
投票

这样的事情可以解决你的问题吗?

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

0
投票

返回 null 和 null 检查是最好的选择,否则,你可以做的是

将日历初始化为今天(如果适合您的场景)。

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


0
投票

只需为属性添加默认值即可:

private Calendar cal = Calendar.getInstance();

0
投票

如果

setCal
没有被调用,那么如果
cal
没有设置,为什么你想发送除了
null
之外的其他东西? 在这种情况下,返回
null
是最好的选择。 Null 也是一个值,它向开发人员提供指示。 而且,因为开发人员不知道您的
getCal
不能返回 null,所以即使您从不返回 null,他们也会检查 null(我假设对于 getter 和 setter,开发人员不会阅读 javadoc)。

也许您可以发送默认日历的新实例。但默认值是当前日期,所以我认为这不是一个好主意,因为它并不代表日历尚未设置的事实。

或者你可以抛出异常...但不要滥用异常。异常旨在定义错误或不良行为,而不是简化功能检查。 但是,为了保护 null 值的

setCal
方法,如果用户设置 null 值,这里可以抛出
IllegalArgumentException


0
投票

如果您反对在整个代码中检查 null,您可以实现如下所示:

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

这将使您的代码更具可读性,但即使

getCal()
对象没有,您仍然必须让
Test
返回某些内容,并且返回
null
似乎是这种情况下的最佳选择。


0
投票

代码的上下文不明确,根据上下文返回 null 可能是有利的。但一般来说,当您试图说“我没有信息可返回”时,返回 null 会清楚地显示这一点。此外,它也让其他人更容易观察到这一点。

除了返回 null 之外还有其他选择吗?

其实还有很多其他的方式;这取决于具体情况。另一个例子是“选项模式”。它的想法依赖于封装一个可选值;无或原始数据。通过这种方式,您可以返回一个有意义的值(这在 Haskell 中大量使用,在某种程度上 Scala 也有使用)。尽管如此,应该小心行事,因为返回指示“空”的封装可能不会被注意到,除非仔细记录并同意作为约定(例如与您的团队)。

© www.soinside.com 2019 - 2024. All rights reserved.