Java Top.

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程

1.介绍

可选的在Java 8中引入了类型。它提供了一种清晰明确的方式来传达可能在不使用的情况下可能没有值的消息空值

得到一个可选的返回类型,我们可能会检查值是否缺失,导致更少空指针异常在申请中。然而可选的类型不适合所有地方。

虽然我们可以在我们看到适合的任何地方使用它,但在本教程中,我们将专注于一些使用的最佳实践可选的作为返回类型。

2。可选的作为返回类型

一个可选的除了在教程后面稍后讨论的某些方案,类型可以是大多数方法的返回类型。

大多数时候,回来了可选的很好:

公共静态可选 finduserbyname(字符串名称){user user = usersbyname.get(name);可选 opt =可选.ofnullable(用户);退货选择;}

这很方便,因为我们可以使用可选的呼叫方法中的API:

公共静态void changeSername(String OldFirstName,String NewFirstName){findUserbyFirstName(OldFirstName).ifpresent(user  - > user.setfirstname(newfirstname));}

它也适用于静态方法或实用方法来返回可选的价值。但是,我们不应该返回许多情况一个可选的类型。

3.什么时候不返回可选的

因为可选的是一种包装物和价值为基础班级,有一些无法做到的操作可选的目的。很多次,它只是更好地返回实际类型而不是一个可选的类型。

一般来说,对于Pojos的Getters,它更适合返回实际类型,而不是一个可选的类型。特别是,对于实体Bean,数据模型和DTO来说,具有传统的吸气器是重要的。

我们将研究下面的一些重要用例。

3.1。序列化

让我们想象我们有一个简单的实体:

公共类袜子实现序列化{整数大小;可选<袜子>对;// ... getter和setter}

这实际上完全无法工作。如果我们试图序列化这一点,我们会得到一个notserializableException.

new objectOutputStream(new bytearrayoutputstream())。writeObject(新Sock());

真的,而且序列化可选的可以与其他图书馆合作它肯定会增加可能是不必要的复杂性。

让我们看一下这种相同的序列化错配的另一个应用程序,这次与JSON。

3.2。杰森

现代应用程序一直将Java对象转换为JSON。如果一个getter返回一个可选的类型,我们很可能会在最后的JSON中看到一些意外的数据结构。

假设我们有一个带有可选属性的bean:

私有字符串名字;public可选 getfirstname(){return optional.ofnullable(firstname);public void setfirstname(String firstname){this.firstname = firstname;}

所以,如果我们使用杰克逊序列化一个实例可选的,我们会得到:

{“FirstName”:{“呈现”:True}}

但是,我们真正想要的是:

{“firstname”:“金宝搏188体育baeldung”}

所以,可选的是序列化用例的疼痛。接下来,让我们看看堂兄序列化:将数据写入数据库。

3.3。JPA.

在JPA,Getter,Setter和Field中应具有名称以及类型协议。例如,一个类型的领域细绳应该与一个名叫的吸气工配对getfirstname.这也返回一个细绳。

在此公约之后,使几件事更简单,包括使用休眠等图书馆的反射,为我们提供了很大的对象关系映射支持。

让我们看看我们的同样用例Pojo中的可选名字。

但是,这次是JPA实体:

@entity public类useroptionfield实现序列化{@id私有long userid;私有可选名字;// ... getter和setter}

让我们继续前进,试着坚持下去:

UserOptionfield User = new useroptionfield();user.setUserID(1L);user.setfirstname(可选.of(“baeldu金宝搏188体育ng”));EntityManager.persist(用户);

可悲的是,我们遇到错误:

由:javax.persistence.persistenceException:[persistenceunit:com.baeldung.op金宝搏188体育tional_turntype]无法在org.hibernate.jpa.boot.boot.boot.boot.boot.poote.poote.persistenceException(entityManagerFactoryBuilderimpl.java:1015)在org.hibernate.jpa上构建Hibernate SessionFactory。。boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:941) at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) at com.baeldung.optionalReturnType.PersistOptionalTypeExample.(PersistOptionalTypeExample.java:11) Caused by: org.hibernate.MappingException: Could not determine type for: java.util.Optional, at table: UserOptionalField, for columns: [org.hibernate.mapping.Column(firstName)]

我们可以尝试偏离本标准。例如,我们可以将属性保持为细绳,但改变吸气剂:

@column(nullable = true)私有字符串名字;public可选 getfirstname(){return optional.ofnullable(firstname);}

看来我们可以拥有两种方式:有一个可选的返回type for getter和一个持久的字段

但是,现在我们与Getter,Setter和Field不一致,利用JPA默认和IDE源代码工具更加困难。

直到JPA有优雅的支持可选的类型,我们应该坚持传统的代码。它更简单,更好:

私有字符串名字;// ...传统的吸气器和甲板

让我们终于看看这会如何影响前端 - 检查我们是否熟悉的问题。

3.4。表达语言

为前端准备DTO具有类似的困难。

例如,让我们想象我们正在使用JSP模板来读取我们的UserOptional.DTO的从请求:

因为它是一个可选的,我们不会看到“金宝搏188体育“。相反,我们会看到的细绳代表的可选的类型:

可选[baeldu金宝搏188体育ng]

这不是JSP的问题。任何模板语言,都是IT速度,羽绒贴或其他东西,都需要为此添加支持。在那之前,让我们继续保持我们的DTOS简单。

4。结论

在本教程中,我们已经了解了我们如何返回可选的对象,以及如何处理这种返回值。

另一方面,我们还了解到,有很多情景我们会更好地不使用可选的返回类型的getter。我们可以使用可选的输入可能没有非空值的提示,我们应该小心不要过度使用可选的返回类型,特别是在实体bean或dto的getter中。

可以找到本教程中示例的源代码GitHub.

Java底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程
1评论
最老的
最新
内联反馈
查看所有评论
评论在本文上关闭!