Optional Java 8中引入的类型对于许多开发人员来说是一件新事物.
一个getter方法返回Optional<Foo>类型代替经典的Foo一个好习惯吗?假设值可以null.
我试图在Spring Rest Controller中使用PUT请求方法部分更新实体时,区分空值和未提供的值.
以下面的实体为例:
@Entity
private class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/* let's assume the following attributes may be null */
private String firstName;
private String lastName;
/* getters and setters ... */
}
Run Code Online (Sandbox Code Playgroud)
我的人员库(Spring Data):
@Repository
public interface PersonRepository extends CrudRepository<Person, Long> {
}
Run Code Online (Sandbox Code Playgroud)
我使用的DTO:
private class PersonDTO {
private String firstName;
private String lastName;
/* getters and setters ... */
}
Run Code Online (Sandbox Code Playgroud)
我的Spring RestController:
@RestController
@RequestMapping("/api/people")
public class PersonController {
@Autowired
private PersonRepository people; …Run Code Online (Sandbox Code Playgroud) 我已经阅读了很多有关Optional应该使用的案例的信息。
我读过的很多页面都说Optional不应将其用于私有实例变量,而应由getter返回。
我本以为将私有实例变量作为可选变量仍然有用。如果有人查看我的代码,他们可以看到值可以为空,而不必检查文档以查看是否可以返回null。
在Scala中,从不使用null,只有在与Java互操作的情况下才使用null。如果值可以为null,建议始终使用可选值。这种方法对我来说更有意义。
这是提及它的页面:
https://blog.joda.org/2015/08/java-se-8-optional-pragmatic-approach.html
这是示例代码。
private final String addressLine; // never null
private final String city; // never null
private final String postcode; // optional, thus may be null
// normal getters
public String getAddressLine() { return addressLine; }
public String getCity() { return city; }
// special getter for optional field
public Optional<String> getPostcode() {
return Optional.ofNullable(postcode);
}
Run Code Online (Sandbox Code Playgroud)
我可以看到的唯一好处是,如果您要序列化对象,则现在可以实现,因为它不会在变量中存储可选内容。
缺点是,在检查getter的返回类型之前,您不知道邮政编码可以为null。如果您不熟悉该代码,则可能会错过此添加操作,从而扩展了类,从而导致空指针异常。
这是一个有关Scala的问题Option。
为什么Java和Scala在使用可选方式方面有区别?