Java 8,JSP-应该将Optional对象放在request.setAttribute()或session.setAttribute()中吗?

时间:2018-07-05 21:05:25

标签: jsp servlets serialization java-8 optional

我意识到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());

问题:

  1. 我们应该将请求中的Optional对象传递给前端JSP,还是传递Optional对象(即Phone对象)的值?

  2. 至于前一个选项,Optional是不可序列化的,因此在分布式系统(会话复制等)中将无法使用。如果我做错了,请纠正我。

  3. 如果我将Phone对象而不是Optional对象传递给请求,这是否意味着我需要使用Optional.get()方法?听说使用Optional时,应始终避免使用isPresent()和get()方法。

在#3的情况下,是否最好使用以下代码(以避免使用get()方法)?

//put Phone object in request/session.
request.setAttribute("phoneObject", optionalPhone.orElseGet(Phone::new));

1 个答案:

答案 0 :(得分:1)

  1. 如果需要设置可选属性的用途是什么?只是不要Optional<Phone>None

  2. 请参阅1。

  3. 不是。该模式宁可遵循以下原则:

    getPhone()
        .map(phone -> Request.withPhone(phone))
        .orElse(Request.withoutPhone())
    

    建议不要使用isPresentget,因为这不是处理Optional的惯用方式(声明式)。比较一下带有我的(伪鳕鱼)建议。