我有一节这样的课
java prettyprint-override">class User {
private String firstName;
private String lastName;
...
}
我希望lastName
属性是可选的。如何在Java中实现这一点?
在某些语言中,它非常优雅和简单,我们只需在字段名后附加一个问号。
您可以使用可选的
monad。尽管说实话,我还是会保持这些值不变,并处理它们在其他地方可以为null的事实(取决于具体情况):
Optional.ofNullable(user.getFirstName()).orElse("unknown");
Optional.ofNullable(user.getFirstName()).orElseThrow(()
-> new InvalidArgumentException("First name is required);
当你调用它时,只需给它赋值null。您也可以只为它分配一个空字符串,然后如果您的用例需要,可以使用一个方法来检查它是否为空,并从中知道该特定用户只有一个名user(“John”,“”)
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必须是字符串,怎么搞?