Tengo una clase de Transaction que se ve así:
public class Transaction { private Transaction parentTransaction; private long amount; private String orderNumber; } Entonces tiene un campo que apunta a otra Transaction .
También hay un método como este:
public void build(Transaction transaction) { final long amount = transaction.getParentTransaction() == null ? transaction.getAmount() : transaction.getParentTransaction().getAmount(); final String orderNumber = transaction.getParentTransaction() == null ? transaction.getOrderNumber() : transaction.getParentTransaction().getOrderNumber(); // same pattern follows for more fields... // do other stuff... } Dependiendo de si existe una parentTransaction , por ejemplo, el campo de amount se utilizará desde la parentTransaction o la transaction . Lo que no me gusta de este enfoque es el uso repetitivo de la transaction.getParentTransaction() == null ? ... plazo.
¿Hay algún patrón o enfoque sobre cómo podría evitar esto?
intente Opcional como lo sugieren otros:
public void build(Transaction transaction) { Transaction parentTransactionElseTransaction = Optional.of(transaction) .map(t -> t.getParentTransaction()) .orElse(transaction); final long amount = parentTransactionElseTransaction.getAmount(); final String orderNumber = parentTransactionElseTransaction.getOrderNumber(); // same pattern follows for more fields... // do other stuff... }Use algunas refactorizaciones menores con Opcional:
public void build(Transaction transaction) { Transaction t = Optional.of(transaction).map(Transaction::getParent).orElse(transaction); long amount = t.getAmount(); String orderNumber = t.getOrderNumber(); // etc }public void build(Transaction transaction) { final long amount = Optional.ofNullable(transaction.getParentTransaction()).orElse(transaction).getAmount(); final String orderNumber = Optional.ofNullable(transaction.getParentTransaction()).orElse(transaction).getOrderNumber(); // same pattern follows for more fields... // do other stuff... } Puede usar Optional.ofNullable().orElse() aquí
Opcional es una opción, pero creo que hay una solución mucho más simple:
public void build(Transaction transaction) { Transaction buildFrom = transaction.getParentTransaction() == null ? transaction : transaction.getParentTransaction(); ... String orderNumber = buildFrom.getOrderNumber(); Si no te gusta esa mezcla de abstracciones, puedes ir un paso más allá y poner eso ? : línea en un pequeño método auxiliar.