Java 8, JSP - должен ли необязательный объект помещаться в request.setAttribute () или session.setAttribute ()? - PullRequest
0 голосов
/ 06 июля 2018

Я понял, что Java Optional Ojbect не является Сериализуемым. Я также понял, что основной целью использования дополнительного объекта является метод, возвращаемый типом.

Учитывая следующий метод:

public Phone(){
    public Optional<Phone> getPhone(){
          // some logic goes here to create a new phone object and then put it in 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. Должны ли мы передать необязательный объект в запросе во внешнюю JSP или передать значение необязательного объекта (т. Е. Телефонного объекта)?

  2. Что касается первого варианта, Optional не сериализуем, поэтому он не будет работать в распределенных системах (репликации сеансов и т. Д.). Пожалуйста, поправьте меня, если я ошибаюсь.

  3. Если я передам объект Phone вместо Optional в запрос, означает ли это, что мне нужно будет использовать метод Optional.get ()? Я слышал, что мы всегда должны избегать использования методов isPresent () и get () при использовании Optional.

В случае # 3, лучше ли использовать следующие коды (чтобы избежать использования метода get ())?

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

1 Ответ

0 голосов
/ 06 июля 2018
  1. Какая польза от необязательного атрибута, если его нужно установить? Только не надо, если Optional<Phone> равно None.

  2. см. 1.

  3. Это не так. Шаблон скорее будет чем-то вроде:

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

    Использование isPresent и get не рекомендуется, поскольку это не идиоматический (декларативный) способ работы с Optional. Сравните это, например. с моим (псевдокодовым) предложением.

...