Si un tercero solicita un argumento attachments en un método, ¿cómo puedo evitar usar un if y romper el encadenamiento del método, sabiendo que mi argumento puede ser nulo?

Preferiría NO usar una condición if para .withAttachments, cuando los archivos adjuntos == nulo. Sé que javascript tiene método? (), Pero ¿qué es apropiado para java8 o superior? En el caso donde (archivos adjuntos == nulo), no quiero llamar a .withAttachments() en absoluto. Pero, no veo una sintaxis comparable al método A? () Como en javascript o mecanografiado.

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

¿Debería hacer esto?

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
Jerry 28 abr. 2020 a las 01:27

2 respuestas

Si withAttachments() no permite un valor null, entonces sí, necesita if (attachments != null).

Pero, dado que los constructores no requieren (generalmente) un orden específico de llamadas a métodos, puede limpiar el código un poco.

EmailBuilder eb = emailBuilder()
        .withSubject(email.getSubject())
        .withReplyTo(replyAddresses)
        .withHeader("X-showheader", email.getHeader());
if (attachments != null)
    eb.withAttachments(attachments);
return eb.build();
2
Andreas 27 abr. 2020 a las 22:38

¿Asumo que no puede cambiar el contrato de withAttachments para ignorar las llamadas con nulo? Podría, adjuntar los archivos adjuntos aguas arriba en un Optional y luego proporcionar un orElse con una impl vacía, pero no nula, del tipo attachments, p. (suponiendo que attachments es un List):

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

...

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

ACTUALIZACIÓN (basado en la entrada del comentario, sombrero para Andreas)

También puede lograr esto con un ternario, por ejemplo:

.withAttachments(attachments != null ? attachments : Collections.emptyList())
0
Taylor 27 abr. 2020 a las 22:46