当前位置: 首页 > 知识库问答 >
问题:

如何使字段可选?

洪雅健
2023-03-14

我有一节这样的课

java prettyprint-override">class User {
  private String firstName;
  private String lastName;

  ...
}

我希望lastName属性是可选的。如何在Java中实现这一点?

在某些语言中,它非常优雅和简单,我们只需在字段名后附加一个问号。

共有3个答案

葛和志
2023-03-14

您可以使用可选的monad。尽管说实话,我还是会保持这些值不变,并处理它们在其他地方可以为null的事实(取决于具体情况):

Optional.ofNullable(user.getFirstName()).orElse("unknown");

Optional.ofNullable(user.getFirstName()).orElseThrow(() 
    -> new InvalidArgumentException("First name is required);

欧阳斌
2023-03-14

当你调用它时,只需给它赋值null。您也可以只为它分配一个空字符串,然后如果您的用例需要,可以使用一个方法来检查它是否为空,并从中知道该特定用户只有一个名user(“John”,“”)

淳于开畅
2023-03-14

Java没有语言概念。

在Java中,所有(非基元)类型都是空的,因此可以看到是可选的。所以你可以分配它null,然后收工。

为了克服与此相关的问题,让意图更清晰并争取快速失败,我所看到的是在内部为它分配null,并返回Optional

所以这样做的一个方法可能是:

class User {
  private String firstName;
  private String lastName;

  User(@NotNull String firstName) {
     this(firstName, null);
  }

  User(@NotNull String firstName, @Nullable String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  @NotNull Optional<String> getLastName() {
    return Optional.ofNullable(lastName);
  }

  void setLastName(@Nullable String lastName) {
    this.lastName = lastName;
  }

  ...
}

我特意使用了@NotNull@Nullable注释,以使您更清楚地了解在这种设计中允许null的位置。

请注意,如果您有更多可选参数,那么构建器模式也可能变得很方便。

最后,首先还要考虑是否有可选值是一个好的设计——也许你可以在更大的范围内重新设计整个东西,以共同观察情况。

请注意,通常不建议将字段存储为可选

可选的被设计成只被那些想要指示缺少返回值的方法使用。

您可以在此处阅读更多有关内容:

  • 在类中使用Optional作为属性是一种好的做法吗
  • 用于可选的

 类似资料:
  • 我在SQL服务器数据库中有表用户,有近30列。我还为相应的数据库表创建了一个JPA实体。JPA实体如下所示: 现在我正在尝试创建一个本机查询,它只会从用户表中获取id和name。Repository类看起来像这样。 现在,当它被执行时,它会抛出一个异常,如下所示: 当我将地址列添加到我的查询时,这个异常会消失,但它会出现在另一个字段中。 所以,现在我想修改JPA实体,使这个字段成为可选的。我试过使

  • 问题内容: 我有一个带有一个可选字段的对象,找不到合适的注释来对其建模。有什么想法和Jackson一起做的正确方法是什么? 问题答案: 在Jackson中,您无法区分可选字段和非可选字段。只需在您的POJO中声明任何字段即可。如果您的JSON结构中没有字段,那么Jackson将不会调用setter。您可以跟踪在POJO中是否用标志调用了setter。

  • 我有一个名为<code>platform</code>的字段,它可以是<code>字符串</code>或<code>字符串〔〕 打字接口 json模式 如你所见,我试图在oneOf数组中给两个对象都添加可空字段。然而,类型仍然存在一个问题 [错误] 11:07:49 ⨯ 无法编译 TypeScript: src/api/leaderboard/entity/entity-leaderboard.i

  • 当我在Windows10中运行桌面JavaFX应用程序时,输入窗格(使用SceneBuilder创建)的第一个字段如下所示: 我希望光标出现时,用户不必将鼠标指针定位在字段中并单击。 类似地,如果我在输入字段中输入一些有效的数据并按下Tab键,焦点将传递到下一个字段,但光标不再可见:

  • 我是java和objectMapper的新手。我正在尝试解析json字段,该字段可能具有两种类型,它可能是字符串或数组。 例如: 或 类示例: 我使用objectMapper来反序列化json,当“full_name”字段有一个字符串时可以正常工作,但是当数组到达时,数组无法反序列化。 这个想法是,当到达一个字符串时,将值放在属性中,但当到达数组时,将数组元素连接为字符串(String.join

  • 上面的password是非必填,按照上面的写法,如果填了password,controller中拿不到password的值。 只有加上一个注解才可以。加上注解如果不传,又会提示password必须是字符串,怎么搞?