我意识到Java Optional Ojbect不可序列化。我还意识到使用Optional对象的主要目的是为方法返回类型。
给出以下方法:
public Phone(){
public Optional<Phone> getPhone(){
// some logic goes here to create a new phone object and then put it in optional...
}
}
在客户端类中,它调用上述方法来检索Optional对象,然后将其传递给请求,以便前端JSP页面可以使用此对象:
Optional<Phone> optionalPhone = (new Phone()).getPhone();
// 1. put Optional object in request/session.
request.setAttribute("optionalPhone ", optionalPhone );
// or 2. put Phone object in request/session.
request.setAttribute("phoneObject", optionalPhone.get());
问题:
我们应该将请求中的Optional对象传递给前端JSP,还是传递Optional对象(即Phone对象)的值?
至于前一个选项,Optional是不可序列化的,因此在分布式系统(会话复制等)中将无法使用。如果我做错了,请纠正我。
如果我将Phone对象而不是Optional对象传递给请求,这是否意味着我需要使用Optional.get()方法?听说使用Optional时,应始终避免使用isPresent()和get()方法。
在#3的情况下,是否最好使用以下代码(以避免使用get()方法)?
//put Phone object in request/session.
request.setAttribute("phoneObject", optionalPhone.orElseGet(Phone::new));
答案 0 :(得分:1)
如果需要设置可选属性的用途是什么?只是不要Optional<Phone>
是None
。
请参阅1。
不是。该模式宁可遵循以下原则:
getPhone()
.map(phone -> Request.withPhone(phone))
.orElse(Request.withoutPhone())
建议不要使用isPresent
和get
,因为这不是处理Optional
的惯用方式(声明式)。比较一下带有我的(伪鳕鱼)建议。