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

标签 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);
    }

}

我应该如何进行?

最佳答案

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

如果您不想抛出异常(就像您目前所做的),那么这种类型的遗留就很好,因为它允许您作为 API 设计者来协助代码的用户以安全的方式覆盖所有基地,null安全和 self 记录的方式。当然要写一些 javadoc 来解释为什么返回类型包含在 Optional 中。也不会伤害:)

关于java - 如何使用带有可选数据的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31155872/

相关文章:

java - Eclipse 调试器中的 toString() 不可用错误

java - 导入模块库后 Gradle 错误

java - 如何通过catalina.out查找tomcat自动关机原因

java - ElasticSearch 中映射和类型之间的混淆

java.lang.NoSuchMethodError : org. springframework.core.convert.support.ConversionServiceFactory.createDefaultConversionService() 错误

java - Terracotta + Compass = Hibernate + HSQLDB + JMS?

java - 邮件被防火墙阻止

java - 将 JPanel 添加到 JFrame 失去组织组件的能力 - Java

java - java应用程序在windows和os x上的可行性

java - Gradle with Eclipse - 资源未被过滤