如何使用带有可选数据的方法

时间:2015-07-01 08:08:35

标签: java

我创建了一个名为Person的类,它使用Optional<LocalDate>将一个人的生日存储为字段。我有一个名为timeToNextBirthday的方法,它计算呼叫时间和下一个生日之间的间隔。我遇到的问题是,由于生日是可选的,因此该方法有时无法返回。我不知道我是应该抛出异常还是只返回一些默认对象。我还考虑将返回类型设置为可选,如果生日未知,则返回空选项。到目前为止,这是我的代码片段,使用异常选项。

public class Person {
    private Optional<LocalDate> dateOfBirth;

    public Period timeToNextBirthday() throws NoSuchElementException {
        if(!dateOfBirth.isPresent()) {
            throw new NoSuchElementException("Birthday is unknown");
        }

        LocalDate currentDate = LocalDate.now();

        // Assume this year's birthday has not passed and set next birthday to this year
        LocalDate nextBirthday = dateOfBirth.get().withYear(currentDate.getYear());

        // Add a year to nextBirthday if this year's birthday has already passed or is today
        if (currentDate.isAfter(nextBirthday) || currentDate.equals(nextBirthday)) {
            nextBirthday = nextBirthday.plusYears(1);
        }

        return Period.between(currentDate, nextBirthday);
    }

}

我该怎么办?

1 个答案:

答案 0 :(得分:1)

考虑这一点:将方法的返回类型更改为Optional<Period>会使该方法的用户非常清楚,由于{{1},它可能不会导致可用的Period是可选的,必须使用户空间代码适应这一事实。

如果您不想抛出异常(就像您目前所做的那样),这种类型的结转就可以了,因为它允许您作为API设计师协助用户您的代码以安全,dateOfBirth安全和自我记录的方式涵盖所有基础。当然写了一些javadoc来解释为什么返回类型包含在null中也不会伤害:)