Java Метод Цепочка Необязательно на основе аргументов - PullRequest
2 голосов
/ 28 апреля 2020

Если третья сторона запрашивает аргумент attachments в методе, как я могу избежать использования if и разбить цепочку методов, зная, что мой аргумент может быть нулевым? Метод имеет следующее определение.

// import org.jetbrains.annotations.NotNull;
EmailBuilder withAttachments(@NotNull List<Attachment> attachments);

Я бы предпочел NOT , используя условие if для .withAttachments, когда attachments == null. Я знаю, что javascript имеет метод? (), Но что подходит для java8 или выше? В случае, когда (attachments == null) я вообще не хочу звонить .withAttachments(). Но я не вижу синтаксис, сопоставимый с methodA? (), Как в javascript, или машинописный текст.

return emailBuilder()
  .withSubject(email.getSubject())
  .withReplyTo(replyAddresses)
  .withAttachments(attachments) // This is conditional...based on attachments
  .withHeader("X-showheader", email.getShowHeader());
  .build();

Требуется ли мне это делать?

EmailBuilder eb = emailBuilder()
  .withSubject(email.getSubject())
  .withReplyTo(replyAddresses);
  if(attachments)
    eb = eb.withAttachments(attachments); // This is conditional...based on attachments
  eb = eb.withHeader("X-showheader", email.getHeader())
  .build;
return eb;

Ответы [ 2 ]

4 голосов
/ 28 апреля 2020

Если withAttachments() не допускает значение null, тогда да, вам нужно if (attachments != null).

Но, поскольку сборщики не (обычно) не требуют определенного порядка c вызовы методов, вы можете немного очистить код.

EmailBuilder eb = emailBuilder()
        .withSubject(email.getSubject())
        .withReplyTo(replyAddresses)
        .withHeader("X-showheader", email.getHeader());
if (attachments != null)
    eb.withAttachments(attachments);
return eb.build();
2 голосов
/ 28 апреля 2020

Я предполагаю, что вы не можете изменить контракт withAttachments, чтобы игнорировать вызовы с нулем? Вы можете обернуть вложенные вложения в Optional, а затем предоставить orElse с пустым, но не нулевым, значением любого типа attachments, например (при условии, что attachments является List):

Optional<...> optionalAttachments = Optional.ofNullable(attachments);

...

.withAttachments(optionalAttachments.orElse(Collections.emptyList())

ОБНОВЛЕНИЕ (на основе комментариев из комментариев, хетта Андреасу)

Этого также можно добиться с помощью троичной системы, например:

.withAttachments(attachments != null ? attachments : Collections.emptyList())
...